Запрос данных на основе отношений 3-го уровня в CakePHP - PullRequest
0 голосов
/ 13 сентября 2009

У меня установлены следующие отношения:

A HABTM B
B belongsTo C
C hasMany B

Теперь для данного A мне нужны все C с прикрепленными B. Я могу написать SQL-запросы, но как правильно использовать CakePHP? Какой метод я вызываю для какой модели и с какими параметрами?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2009

Я бы подумал о «контейнерном» поведении (http://book.cakephp.org/view/474/Containable)... дает большой контроль над поиском связанных данных.

0 голосов
/ 14 сентября 2009

это может сработать

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));
0 голосов
/ 14 сентября 2009

Я бы пошел с ответом Азиза и просто обработал данные по мере их поступления. Если вы хотите, чтобы C была вашей основной моделью, вам придется сделать небольшой обходной путь. Cake не очень хорошо справляется с условиями на связанных моделях, особенно для запросов типа удаленных кузенов. Обычно он выполняет только реальные JOIN-запросы для отношений ownTo или hasMany; не в отношении HABTM, хотя и в отдельных запросах. Это означает, что вы не можете включать условия в соответствующие модели HABTM.

Тогда ваша лучшая ставка может выглядеть примерно так:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

Обратите внимание, что это вызывает довольно много запросов, поэтому это не совсем оптимальное решение. Написание собственного SQL может быть самым чистым способом.

EDIT:

В качестве альтернативы, вы можете повторно связать свои ассоциации на лету , чтобы сделать их отношениями hasMany / ownTo, скорее всего, используя таблицу / модель соединений A и B. Это может позволить вам использовать связанные модели легче, но все еще сложно получить Cs, когда условие на A.

0 голосов
/ 13 сентября 2009
$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

как это?

...