Поиск CakePHP из отношения HABTM

#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 автоматически создаст соединения за кулисами, когда сочтет нужным).