Найти с HABTM в CakePHP - PullRequest
       11

Найти с HABTM в CakePHP

0 голосов
/ 21 февраля 2012

Я знаю, что есть несколько таких вопросов по SO, и я прошел через большинство из них, но так как я не могу понять, где я иду не так, я думаю, что я мог бы быть где-то неуклюжей опечаткой, гдепропускаюВот мои модели:

class Country extends AppModel {
    var $name = 'Country';

    var $hasAndBelongsToMany = array(
        'Entity' => array(
            'className' => 'Entity',
            'joinTable' => 'countries_entities',
            'foreignKey' => 'country_id',
            'associationForeignKey' => 'entity_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

}

class Entity extends AppModel {
    var $name = 'Entity';

    var $hasMany = array(
        'Alert' => array(
            'className' => 'Alert',
            'foreignKey' => 'entity_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );


    var $hasAndBelongsToMany = array(
        'EntityGroup' => array(
            'className' => 'EntityGroup',
            'joinTable' => 'entities_entity_groups',
            'foreignKey' => 'entity_id',
            'associationForeignKey' => 'entity_group_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        ),
        'Country' => array(
            'className' => 'Country',
            'joinTable' => 'countries_entities',
            'foreignKey' => 'entity_id',
            'associationForeignKey' => 'country_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

}

Я хочу сделать поиск, который возвращает все сущности, основанные на идентификаторе страны, т.е.

select entities.ticker from entities
join countries_entities on entities.id=countries_entities.entity_id
where country_id=78

Вот последняя итерация поискаоператор, который я пробовал:

$blap = $this->Entity->find('all', array('recursive'=>1,'fields'=> 'Entity.ticker','conditions'=>array('Country.id'=>78)));

И это SQL, который Cake генерирует, который генерирует ошибку SQL (он не пытается построить запрос с помощью таблицы соединения):

SELECT `Entity`.`ticker`, `Entity`.`id` FROM `entities` AS `Entity` WHERE `Country`.`id` = 78 LIMIT 1

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

с $hasAndBelongsToMany отношениями, часто проще вызвать find() для модели, которую вы хотите отфильтровать:

$this->Entity->Country->find('first', array('conditions' => array('Country.id' => 78)));

Будет возвращена только та страна, которую вы хотите, и связанные с ней моделиЭто то, что вы хотите.

В этом случае я не совсем уверен, что параметр fields работает на связанной модели (Entity здесь), но если это не так, вы можете использоватьВместо этого сдерживаемое поведение в стране.

0 голосов
/ 21 февраля 2012
$this->Entity->bindModel(array('hasOne' => array('CountriesEntities')));

$blap = $this->Entity->find('all', array(
                                    'conditions' => array('CountriesEntities.country_id' => 78),
                                    'recursive' => 2
));
0 голосов
/ 21 февраля 2012

изменить тип ассоциации EntityGroup hasMany вместо hasAndBelongsToMany в классе модели Entity

...