我有一个文章表和一个评论表。 文章有很多评论。 每个评论都属于评论状态(comment_status_id): 1.好,还是 2.不好,或者 3.丑。
我想查询所有具有状态3(丑)的仅具有注释的文章。也就是说,排除具有任何状态为1或2的评论的文章。
我可以编写一个子查询并进行查询,以获取所有带有Status Ugly注释的文章:
$matchingComments = $this->Articles->getAssociation('Comments')->find()
->select(['article_id'])
->distinct()
->where(['comment_status_id' => 3]);
$query = $this->Articles->find()
->where(['Articles.id IN' => $matchingComments]);
这给了我所有带有状态为3的注释的文章,但是它还包括状态为2或1的注释的文章,以及至少一个状态为3的注释。
所以我的问题是: 是否有一种有效/优雅的方法来使该查询与查询生成器一起使用,因此结果仅是所有注释都为comment_status 3(丑陋)的文章?
我确定我可以使用for循环解析$ query结果并建立一个新的结果数组,但是我想看看是否有更好的方法可以在初始查询中和/或使用子查询。 预先感谢您的任何建议!
D。
答案 0 :(得分:1)
遵循ndm的建议,首先使原始sql工作,此查询适用于我的matchingComments查询
SELECT `article_id`
FROM `comments`
GROUP BY `article_id`
HAVING MIN(`comment_status_id`) = 3
AND MAX(`comment_status_id`) = 3;
然后在我的Cake控制器中,它起作用:
$matchingComments = $this->Articles->getAssociation('Comments')->find()
->select(['article_id'])
->group('article_id')
->having(['MIN(comment_status_id)' => 3])
->having(['MAX(comment_status_id)' => 3])
$query = $this->Articles->find()
->where(['Articles.id IN' => $matchingComments]);
不确定是否有更好的方法,但是效果很好。 再次感谢ndm。 D。
答案 1 :(得分:0)
来自Cake Book - Retrieving Data & Results Sets
$articles = $this->Articles
->find()
->contain(['Comments'])
->notMatching('Comments.CommentStatus', function($q) {
return $q->where(['CommentStatus.comment_status_id' => '3'];
});