CakePHP Содержит не работает с рекурсивным - PullRequest
3 голосов
/ 29 февраля 2012

Когда я пытаюсь:

// Removed the limit to ensure that all of the group notes items can be found and collapsed
$recent_notes = $this->User->Note->find('all', array(
    'recursive' => 2,
    'order' => 'Note.created DESC',
    'conditions' => $conditions,
    'contains' => array(
        'NotesUser', 'Poster', 'Comment' => array('Poster')
    )
));

Это не ограничивает вывод вообще - я получаю каждую связанную модель.Однако, когда я не указываю recursive как 2, или если я указываю его как 1, мне не хватает модели Comment=>Poster.

Как получитьмодели мне нужны? Спасибо!

Ответы [ 3 ]

8 голосов
/ 29 февраля 2012

Чтобы получить только те модели, которые вам нужны, используйте [Содержимое поведения] :

  • , установите рекурсивное значение -1
  • , используйте 'contain' единственное число,НЕ 'contains' во множественном числе, как у вас
  • , убедитесь, что вы устанавливаете переменную $actsAs в своей модели: public $actsAs = array('Containable');

Все, кого я знаю, задают $this->recursive = -1;в AppModel ... по умолчанию все рекурсивно -1, поэтому вам никогда не придется устанавливать его заново, если вы не хотите включать больше данных ... и в этих случаях я почти всегда использую contain(), а не $recursive.

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

Рекурсив игнорируется, как только вы установили содержать.

Из документов:

ContainableBehavior имеет ряд параметров, которые можно установить, когда Поведение привязано к модели. Настройки позволяют оштрафовать настроить поведение Containable и работать с другими поведениями более без труда.

recursive (boolean, optional) установлен в true, чтобы разрешить вмещать автоматически определять уровень рекурсивности, необходимый для извлечения указанные модели и установите рекурсивность модели на этом уровне. установка в false отключает эту функцию. Значением по умолчанию является true.

Убедитесь, что ключ массива установлен как «содержит», а не «содержит», как вы опубликовали выше, например:

$this->Post->find('all', array('contain' => 'Tag'));

Я также предполагаю, что вы правильно загружаете и присоединяете содержимое. Если у вас возникли проблемы, документация здесь .

1 голос
/ 16 мая 2013

Если у вас глубокая связь, например, History принадлежит складу, а Warehouse принадлежит компании, и вы хотите только Warehouse.Company, вы также можете использовать

'contain'   => array('Warehouse.Company')
...