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 查找所有有评论的帖子的主要内容,如果未能解决你的问题,请参考以下文章