cakephp Найти все сообщения с комментариями - PullRequest
1 голос
/ 07 октября 2010

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

$this->Post->find('all', ???);

Я закончил писать свой собственный запрос, в приведенном ниже примере все сообщения, по крайней мере, с 1 комментарием найдены

SELECT *
  FROM (
       select posts.*, count(comments.id) as comment_count
        from posts left join comments on posts.id = comments.post_id
        group by posts.id
       ) as T
 WHERE comment_count != 0

, но, похоже, будетлучший способ сделать это.

Примечание: сообщение имеет множество комментариев и комментариев к сообщению

Ответы [ 3 ]

2 голосов
/ 08 октября 2010
$grouped_comments = $this->Comment->find('all', array('group' => 'Comment.post_id'));

Это даст вам массив всех комментариев, сгруппированных по post_id, так что у вас будет ровно один комментарий для каждого сообщения, что вам и нужно.Оттуда вы можете делать все, что вы хотите с этими данными.

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

echo "<H1>Posts with comments:</H1>";
foreach ($grouped_comments as $comment) {
echo $comment['Post']['Title'] . "<br>";
}

Это, конечно, работает только есливаши модельные отношения установлены в вашей модели comment.php.

0 голосов
/ 09 октября 2010

Я все еще довольно новичок в CakePHP, но я думаю, что вы можете использовать counterCache, чтобы отслеживать количество комментариев модели записи в поле в поле в вашей таблице сообщений, а затем использовать некоторые простые условия в своей находке, чтобы получить то, что вы ищем. counterCache автоматически обновляет поле счетчика кэша в поле записи родительской модели при добавлении / удалении записей дочерней модели.

counterCache для CakePHP 1.2: http://book.cakephp.org/view/816/counterCache-Cache-your-count

0 голосов
/ 07 октября 2010

Одним из решений будет:

$this->Post->find('all');

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

$posts = $this->Post->find('all');
count($posts[0][Comment]);

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

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