Получение рекурсивных данных с помощью функции чтения в CakePHP
У меня есть что-то вроде системы блогов. Каждая запись может иметь комментарии. Каждый комментарий создается пользователем.
В настоящее время я использую функцию чтения в моем действии 'view' на контроллере, чтобы получить все данные.
Отношения между моделями уже созданы (принадлежат, hasMany... и т. Д.)
Когда вызывается представление ввода, я получаю что-то вроде этого:
['Entry'] => Array
(
[id] => 1
[body] => 'xxxxxx'
[...] => ...
)
[Comment] => Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[body] => This is an example of a comment guys!
[created] => 0000-00-00 00:00:00
)
[1] => Array
(
[id] => 2
[user_id] => 1
[body] => This is the 2nd comment!!!
[created] => 0000-00-00 00:00:00
)
)
Есть ли способ, с помощью функции чтения, получить также "рекурсивные" данные Комментариев, такие как пользовательские данные, связанные с user_id? (чтобы узнать их имена и т. д.)
Я ожидаю что-то вроде этого:
['Entry'] => Array
(
[id] => 1
[body] => xxxxxx
[...] => ...
)
[Comment] => Array
(
[0] => Array
(
[Comment] => Array
(
[id] => 1
[user_id] => 1
[body] => This is an example of a comment guys!
[created] => 0000-00-00 00:00:00
)
[User] => Array
(
[id] => 1
[username] => myusername
[created] => 0000-00-00 00:00:00
)
)
[1] => Array
(
[Comment] => Array
(
[id] => 1
[user_id] => 2
[body] => fasdfasfaT
[created] => 0000-00-00 00:00:00
)
[User] => Array
(
[id] => 2
[username] => myusername2
[created] => 0000-00-00 00:00:00
)
)
)
Благодарю.
1 ответ
Да, это.
Вы можете контролировать глубину ассоциаций с помощью recursive
атрибут, или, скорее, использовать containable
поведение, чтобы точно указать, какие модели вы хотите включить. Я всегда включаю это поведение для всех моделей в AppModel.php
($actsAs = array('Containable');
). Тогда используйте это так:
$this->Entry->find('all', array(
...
'contain' => array('Comment' => 'User')
));
Результат будет выглядеть так:
['Entry'] => Array
(
[id] => 1
[body] => xxxxxx
[...] => ...
)
[Comment] => Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[body] => This is an example of a comment guys!
[created] => 0000-00-00 00:00:00
[User] => Array
(
[id] => 1
[username] => myusername
[created] => 0000-00-00 00:00:00
)
)
)
По моему опыту, Cake не очень эффективно запрашивает глубокие ассоциации. В вашем случае это будет генерировать запрос для каждого Comment
принести его User
, Я бы избегал этого, позволяя Cake получать только комментарии, а затем собирать идентификаторы комментариев, получать всех пользователей с этими идентификаторами в одном запросе, а затем добавлять эту информацию о пользователе к исходному результату.