CakePHP: Как мне подсчитать количество записей hasMany в находке? - PullRequest
4 голосов
/ 26 июня 2010

У меня есть две модели, Post имеет много Comment. Как выбрать все Post, которые имеют менее двух Comment?

Я пытался использовать find с 'fields'=>array('COUNT(Comment.id) as numComments','Post.*'), (а затем делал numComments < 2 в 'conditions'). Но я получаю Unknown column 'Comment.id' in 'field list' ошибку.

Спасибо!

РЕДАКТИРОВАТЬ: я получил CakePHP для создания этого запроса:

SELECT `Post`.*, FROM `posts` AS `Post` 
    LEFT JOIN comments AS `Comment` ON (`Post`.`id` = `Comment`.`text_request_id`)  
    WHERE COUNT(`Comment`.`id`) < 2 
    GROUP BY `Comment`.`post_id` 
    LIMIT 10

Но я получаю ошибку #1111 - Invalid use of group function в функции COUNT.

EDIT: Принято решение, используйте HAVING COUNT вместо WHERE COUNT.

Ответы [ 3 ]

17 голосов
/ 26 июня 2010
class Post extends AppModel
{
    var $name = "Post";
    var $hasMany = array('Comment'=>array('counterCache'=>true));
}

добавить поля comment_count в сообщения

и это все: -)

1 голос
/ 26 июня 2010

В сыром SQL запрос будет выглядеть примерно так:

SELECT Post.*
FROM Post LEFT JOIN Comment ON Post.id = Comment.post_id
GROUP BY Comment.post_id
HAVING COUNT(Comment.id) < 2

Большинство из них легко переводятся на торт:

array(
    'having' => array('COUNT(Comment.id) <' => 2),
    'group'  => array('Comment.post_id')
)

Cake не присоединяется автоматически к таблицам hasMany, но это то, что вам нужно сделать вручную. Посмотрите документацию для деталей.

Edit:

Вы можете сделать предложение having следующим образом:

array(
    'group' => 'Comment.post_id HAVING COUNT(Comment.id) < 2'
)

Ограничения string только для группы и не могут быть выполнены без группы. Cake 3, вероятно, будет включать в себя больше синтаксиса SQL, например HAVING

0 голосов
/ 03 февраля 2014

Если кому интересно: вот документ о counterCache http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongsto и еще о добавлении нескольких полей counterCache http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#multiple-countercache

...