如何在CakePHP 3.x中基于单个值查询HasMany关联

时间:2019-04-09 13:12:20

标签: cakephp associations cakephp-3.x querying

我有一个文章表和一个评论表。 文章有很多评论。 每个评论都属于评论状态(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。

2 个答案:

答案 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'];
    });