我有一个CakePHP 1.3应用程序,非常喜欢Containable behavior来获取数据。
假设我与评论之间存在一对多关系。我使用Containable查询(用于分页)所有帖子和所属评论的列表。但是我只对每个帖子有多少评论感兴趣。我没有找到任何方法来在没有获取注释的所有行的情况下使用containable实现此查询。我试过了:
$this->paginate=array(
'fields' => 'Post.title, Post.created',
'contain' => array('Comment'=>'COUNT(*) AS count'),
);
结果“模型“注释”与模型“计数”不相关”错误消息。
$this->paginate=array(
'fields' => array('Post.title, Post.created'),
'contain' => array('Comment'=>array('fields'=>'COUNT(*) AS count'),
);
不起作用,结果集为每个帖子包含一个空的Comment数组(最后一个数组除外),其中最后一个数组包含count字段,但具有所有注释的数量而不仅仅是所属注释的数量。
我的另一个猜测是
$this->paginate=array(
'fields' => 'Post.title, Post.created, COUNT(Comment.id)',
'contain' => array('Comment'=>array('fields'=>''),
);
但这会导致错误,因为hasMany关系是独立查询的,因此Answer表不在查询Post条目中。
我如何计算帖子的评论数?
最佳答案
好吧,最好的方法是在comment_count
表中设置一个名为posts
的字段,并将此键添加到Comment模型$ belongsTo Post数组中:'counterCache' => true
每当注释发生任何事情时,相关帖子中的comment_count字段都会更新(实际上,它每次都会重新计数,而不仅仅是添加或删除)。
更好,因为当您为用户获取数据时,它的处理速度更快,甚至不会触及注释表。由于您使用的是Containable行为,因此我想您想要的是速度和轻便。