Запрос данных на основе отношений третьего уровня в CakePHP

StackOverflow https://stackoverflow.com/questions/1415990

  •  06-07-2019
  •  | 
  •  

Вопрос

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

A HABTM B
B belongsTo C
C hasMany B

Теперь для данного А мне нужны все С с присоединенными буквами Б.Я могу писать SQL-запросы, но как правильно использовать CakePHP?Какой метод для какой модели вызывать и с какими параметрами?

Это было полезно?

Решение

Я бы согласился с ответом Азиза и просто обрабатывал данные по мере их поступления.Однако если вам нужно, чтобы 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, возможно, будет самым простым способом.

РЕДАКТИРОВАТЬ:

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

Другие советы

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

как это?

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

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top