Получение рекурсивных данных с помощью функции чтения в 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 получать только комментарии, а затем собирать идентификаторы комментариев, получать всех пользователей с этими идентификаторами в одном запросе, а затем добавлять эту информацию о пользователе к исходному результату.

Другие вопросы по тегам