Как получить данные из связанных моделей в CakePHP?

Я создаю простой блог с cakephp, где у меня есть несколько сообщений и несколько комментариев. После того, как я испеку приложение, оно создаст папку comments с index.ctp и папку posts с the index.ctp

Что я хочу сделать, так это отобразить их как паровые:

Post1
  comment1
  comment2
Post2
  comment1
  comment2

Если я размещу комментарии внутри сообщений/index.ctp, я получу сообщение об ошибке, говорящее мне, что $comments не определено.

Как я могу это сделать? Спасибо

редактировать: хорошо, извините за возвращение, но это все еще немного неясно. У меня есть настройка отношений $hasMany, на самом деле на странице, которая отображает сообщения, у меня есть ссылка, которая указывает мне на комментарии. Единственное, что я хочу, чтобы они отображались на той же странице, что и сообщения.

я должен быть в состоянии сказать <?php echo $comment['Comment']['content']; ?>


person Patrioticcow    schedule 11.07.2011    source источник


Ответы (1)


Проверьте свои контроллеры.

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

Способ "CakePHP" заключается в определении отношений между моделями. Проверьте свои запеченные модели и посмотрите, есть ли что-то вроде этого:

class Post extends AppModel{

var $hasMany = array( 'Comment' );

}

Когда модели связаны друг с другом, ваш контроллер сообщений автоматически найдет объекты сообщений и связанные с ними объекты комментариев.

Например, эта строка:

$this->Post->findById( $id );

Будет производить что-то вроде этого:

Array
(
    [Post] => Array
    (
        [id] => 42
        [text] => Post1
    )

    [Comment] => Array
    (
        [0] => Array
        (
            [id] => 1
            [post_id] => 42
            [text] => Comment1
        )

        [1] => Array
        (
            [id] => 2
            [post_id] => 42
            [text] => Comment2
        )
    )
)

Хорошая документация на http://book.cakephp.org/

EDIT: добавление дополнительной информации после вашего комментария

Пока у моделей есть ассоциация, CakePHP будет извлекать данные соответствующим образом (если вы не установите Recursive => false или не используете Containable что, как я полагаю, не так).

Проверьте свой контроллер PostsController и посмотрите, как он загружает данные. Я предполагаю, что он делает что-то вроде следующего:

$post = $this->Post->findById( $id );
$this->set( compact( 'post' ) );

or

$this->data = $this->Post->findById( $id );

Проверьте, каким образом он хранит полученные данные, а затем получите доступ к этой переменной из представления.

Например, если он хранит данные в переменной с именем «$post», вы должны поместить в свое представление что-то вроде этого:

// output the 'text' field of the 'post' object
echo $post[ 'post' ][ 'text' ];  

// loop through associated comments
foreach ( $post[ 'comment' ] as $comment ){  

    //output the 'text' field of a 'comment' object
    echo $comment[ 'text' ];  

}

По умолчанию CakePHP хранит множество деталей в массивах после извлечения данных. Хитрость заключается в том, чтобы знать иерархию данных и соответственно извлекать их из массива.

person Farray    schedule 11.07.2011
comment
всегда приветствуется немного больше информации .. может быть, пример? спасибо - person Patrioticcow; 11.07.2011
comment
хорошо, извините за возвращение, но все еще немного неясно. У меня есть настройка отношения $hasMany, на самом деле на странице, которая отображает сообщения, у меня есть ссылка, которая указывает мне на комментарии. Единственное, что я хочу, чтобы они отображались на той же странице, что и сообщения. - person Patrioticcow; 11.07.2011
comment
@Patrioticcow Добавлены примеры. Я уверен, что CakePHP уже извлекает нужные вам данные. Вам просто нужно получить его из массива. Попробуйте поместить <? echo debug( pr( $VariableHoldingPostInfo ) ); ?> в свое представление и посмотрите, как выглядит структура данных. - person Farray; 11.07.2011
comment
@Patrioticcow В дополнение к предыдущему комментарию. Мои примеры в ответе были написаны для отображения 1 сообщения с соответствующими комментариями просто для краткости. Концепция такая же, как и для перебора массива сообщений. - person Farray; 11.07.2011