CakePHP: список комментариев, связанных с сообщением - PullRequest
0 голосов
/ 01 марта 2012

В моем приложении у меня есть две таблицы (у меня есть больше, но я обсуждаю только две):

**Posts**
id
title
datetime
content

**Comments**
id
content
post_id
user_id

Как вы можете видеть, это связь, использующая post_id в качестве внешнего ключа.

При просмотре сообщения у меня есть следующий код для отображения комментариев:

<?php if ( ! empty($post['Comment']) ): ?>
        <ul>
            <?php foreach ($post['Comment'] as $comment): ?>
            <li>
                <?php echo $comment['title']; ?>
            </li>
            <?php endforeach; ?>
        </ul>
        <?php else: ?>
        <p>No comments...</p>
        <?php endif; ?>

Вот метод контроллера для просмотра сообщения:

function view ( $id = null, $slug = null )
    {
        $post = $this->Post->find('first',array('contain'=>array('User'=>array('Comment','Profile')),'conditions'=>array('Post.id'=>Tiny::reverseTiny($id))));

        if (!$post)
        {
            throw new NotFoundException('404');
        }
        else if($post['Post']['status'] == '0') // 0=draft 1=open 2=open
        {
            if($post['Post']['user_id'] == $this->Auth->user('id'))
            {
                $this->Session->setFlash('Your post has NOT been published yet');
            }
            else
            {
                throw new NotFoundException('404');
            }
        }

        if (Inflector::slug($post['Post']['title']) != $slug || $slug = null)
        {
            $this->redirect(array('id'=>Tiny::toTiny($post['Post']['id']),'slug'=>Inflector::slug($post['Post']['title'])));
        }

        $this->set(compact('post'));
    }

, и этомодель комментария:

class Comment extends AppModel
{
    public $name = 'Comment';

    public $belongsTo = array('User','Post');

    public $actsAs = array('Containable');
}

и типичный URL для сообщения будет: /posts/Sample_post-1ns

Однако я ВСЕГДА получаю сообщение о том, что комментариев нет ... Но я заглянул вбаза данных и их ... и я дважды проверил, что все ассоциации правильны.Так что я могу только предположить, что приведенный выше код неверен!

Кроме того, это лучший способ вызвать комментарии?Поскольку я хочу добавить возможность фильтровать и разбивать их на страницы.

Cheers

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Кажется, вам нужно что-то вроде этого:

Комментарий модели:

public $belongsTo = array('User', 'Post');

Почтовая модель:

public $belongsTo = array('User');
public $hasMany = array('Comment');

Модель пользователя:

public $hasMany = array('Post', 'Comment');

И contain заявление о почтовом отправлении:

'contain' => array('Comment', 'User' => array('Comment', 'Profile'))
1 голос
/ 01 марта 2012

Из вашей схемы похоже, что модель комментария связана с моделью поста, а не с пользователем, поэтому:

$post = $this->Post->find('first',array('contain'=>array('User'=>array('Comment','Profile')),'conditions'=>array('Post.id'=>Tiny::reverseTiny($id))));

Должно быть:

$post = $this->Post->find('first',array('contain'=>array('Comment','User'=>array('Profile')),'conditions'=>array('Post.id'=>Tiny::reverseTiny($id))));

т.е. Комментарий должен находиться вне массива User.

При условии, что на модели Post / User и Comment установлены правильные отношения hasMany и belongsTo соответственно, в первом примере будет получен массив, подобный этому:

 array(
    'Post'=>array(...),
    'User'=>array(
        'id'=>1,
         //Other user data

         'Comment'=>array(
              array(...), //Comment 1
              array(...), //Comment 2
          )
     )
 );

И второй пример даст:

array(
    'Post'=>array(...),
    'User'=>array('id'=>1 //Other user data)
    'Comment'=>array(
          array(...), //Comment 1
          array(...), //Comment 2
     )
 );

Надеюсь, это показывает, что разница заключается в положении клавиши «Комментарий» в массиве - она ​​либо под ключом пользователя, либо на верхнем уровне, в зависимости от того, как вы ее содержите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...