cakephp 查找所有有评论的帖子

Posted

技术标签:

【中文标题】cakephp 查找所有有评论的帖子【英文标题】:cakephp find all posts that have comments 【发布时间】:2010-10-07 18:05:39 【问题描述】:

我创建了一个包含帖子和 cmets 的简单博客。我想找到所有至少有一条评论的帖子,还想找到所有没有 cmets 的帖子。有 cakephp 方法可以做到这一点吗? 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

但似乎有更好的方法来做到这一点。

注意:一个帖子有很多评论和评论属于帖子

【问题讨论】:

【参考方案1】:
$grouped_comments = $this->Comment->find('all', array('group' => 'Comment.post_id'));

这将为您提供按 post_id 分组的所有评论的数组,因此您将针对每个帖子只有一个评论,这就是您想要的。从那里你可以对这些数据做任何你想做的事情。

假设您想发布一个包含 cmets 的所有帖子标题的列表。

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

这当然只有在你的 comment.php 模型中设置了你的模型关系时才有效。

【讨论】:

这是查找所有包含 cmets 的帖子的好方法。你能想出类似的方法来查找所有没有 cmets 的帖子吗? 最简单的事情可能是遍历您的 Post 表并检查每个 Post 是否至少有一条与该特定帖子相关的评论。您必须确保在 Post 模型中设置了一对多关系才能使其正常工作。这有意义吗?【参考方案2】:

一种解决方案是:

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

并且您的关系已按照您上面所说的设置,cmets 将已经返回此信息,您只需要对它们进行计数并从那里处理处理...类似于:

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

可能会有更优雅的方式 - 因为我自己是 CakePHP 的新手,但希望这有一些价值。

【讨论】:

我最初有这个想法,但我认为让数据库来做思考而不是 php 会更好,但这个解决方案也很有效。感谢您的回复。【参考方案3】:

我对 CakePHP 还很陌生,但我认为您可以使用 counterCache 来跟踪 Posts 表中某个字段中每个 Post 模型记录的评论数,然后在 Find 中使用一些简单的条件来获取您想要的正在找。当添加/删除子模型记录时,counterCache 会自动更新父模型记录字段中的缓存计数字段。

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

【讨论】:

以上是关于cakephp 查找所有有评论的帖子的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP - 在模型中查找没有 hasMany 关系的 hasMany 关联?

CakePHP 2.1 - 模型关联 - 保存和查找

Cakephp 3:如何忽略特定查询的先行查找?

在 CakePHP 3 中为文章添加评论

CakePHP- 保存相关模型数据

CakePHP 3 - 加载用户关注的用户的帖子