4

我有两个模型,PosthasMany Comment。如何选择所有Post少于两个的Comment

我尝试使用 a findwith 'fields'=>array('COUNT(Comment.id) as numComments','Post.*'),(然后做 a numComments < 2in '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功能上遇到错误。

编辑:已解决,使用 HAVING COUNT 而不是 WHERE COUNT。

4

3 回答 3

17
class Post extends AppModel
{
    var $name = "Post";
    var $hasMany = array('Comment'=>array('counterCache'=>true));
}

将 comment_count 字段添加到帖子中

仅此而已:-)

于 2010-06-26T11:56:40.047 回答
1

在原始 SQL 中,查询看起来像这样:

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

其中大部分很容易翻译成 Cake:

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

Cake 不会自动加入 hasMany 表,这是您需要手动执行的操作。有关详细信息,请查看文档

编辑:

您可以having按如下方式执行子句:

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

限制string仅适用于组,没有 group by 就无法完成。Cake 3 可能会包含更多SQL语法,例如HAVING

于 2010-06-26T08:15:08.860 回答
0

如果有人感兴趣:这里是关于 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

于 2014-02-03T08:34:34.937 回答