#cakephp-2.0 #cakephp-2.3
#cakephp-2.0 #cakephp-2.3
Вопрос:
У меня есть таблица с именем «компании». Я хочу объединить эту таблицу с «планами». Я написал следующее отношение модели.
Company:
public $hasAndBelongsToMany = array(
'Plan' => array(
'className' => 'Plan',
'joinTable' => 'companies_plans',
'foreignKey' => 'company_id',
'associationForeignKey' => 'plan_id',
'unique' => 'keepExisting',
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
)
);
Plan:
public $hasAndBelongsToMany = array(
'Company' => array(
'className' => 'Company',
'joinTable' => 'companies_plans',
'foreignKey' => 'plan_id',
'associationForeignKey' => 'company_id',
'unique' => 'keepExisting',
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
)
);
CompaniesPlan:
public $belongsTo = array(
'Company' => array(
'className' => 'Company',
'foreignKey' => 'company_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Plan' => array(
'className' => 'Plan',
'foreignKey' => 'plan_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
Теперь я хочу найти из модели компании с помощью join… для этого я написал следующий код…
$companiesWithPlan = $this->find('all', array('joins' => array(
array(
'table' => 'companies_plans',
'alias' => 'CompaniesPlan',
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array('CompaniesPlan.company_id = Company.id')
),
array(
'table' => 'plans',
'alias' => 'Plan',
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array(
'Plan.id = CompaniesPlan.Plan_id',
)
)
)));
Тогда я получаю только данные таблицы компании.. Я не уверен, почему это не работает….
Ответ №1:
Верхний бит, где вы определяете свои $hasAndBelongsToMany
и т.д., выглядит нормально. Это ваш нижний запрос, который отключен. Когда вы используете встроенные ассоциации CakePHP (hasAndBelongsToMany, belongsTo, hasMany и т.д.), Cake позаботится о получении отношений для вас. Вам не нужно указывать какие-либо объединения самостоятельно. Вы должны прочитать документ отсюда до конца страницы: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm
(в частности, обратите внимание, что hasAndBelongsToMany
ассоциации удаляются и создаются заново каждый раз при сохранении записи — убедитесь, что это именно то поведение, которое вы хотите)
Итак, я сказал вам не использовать объединения — вместо этого вы используете сдерживаемое поведение Cake, которое позволяет вам указать, какие ассоциации будут включены при выполнении поиска.
Правильный код должен выглядеть примерно так:
$this->contain(['Company']);
$this->find('all');
Вам также нужно будет обязательно включить сдерживаемое поведение в верхней части вашей модели:
public $actsAs = array('Containable');
Я добавляю containable в свой AppModel.php
, потому что все ваши модели должны использовать его.
PS — время, когда вы бы использовали объединения, — это когда у вас есть случай, который особенно сложен и не может быть легко обработан встроенными ассоциациями Cake — hasMany, belongsTo и т.д. В большинстве случаев вам не нужно использовать соединения (Cake автоматически создаст соединения за кулисами, когда сочтет нужным).