【问题标题】:Cakephp3, How to use where clause and inner join in cakephp3?Cakephp3,如何在 cakephp3 中使用 where 子句和内连接?
【发布时间】:2026-02-03 11:55:02
【问题描述】:

我正在尝试从产品表中获取评论表。 我添加了列名“delete_yn”,这意味着评论是否被删除。 我在下面使用了一些蛋糕查询

return $this->Product->find()
        ->contain(['ProductReview', 'Users'])
        ->where(['Product.product_code' => $productCode])
        ->toArray();

结果就是这样。

但是,现在我想检查评论是否被用户删除并在“del_yn”列中仅显示“n” 我添加了这个查询

->andWhere(['Product.ProductReview.del_yn' => 'n'])

在where子句之后。

但它不起作用。

请帮忙。

【问题讨论】:

  • 试试:- return $this->Product->find() ->contain(['ProductReview', 'Users']) ->where(['Product.product_code' => $productCode,'ChProduct.ChProductReview.del_yn' => 'n']) ->toArray();
  • 为什么别名突然从ProductProductReview变成ChProductChProductReview
  • 哦,对不起,我想让你们轻松阅读。我会更新它。谢谢你

标签: php mysql cakephp cakephp-3.0


【解决方案1】:

不要使用andWhere(['Product.ProductReview.del_yn' => 'n']),而是使用matching(如果cakephp 3.0.x)或innerJoinWith() if(cakephp 3.1.x)并过滤匹配特定关联数据的记录。例如,

return $this->Product->find()
            ->matching('ProductReview', function ($q) {
               return $q->where(['ProductReview.del_yn' => 'n']);
            })
            ->contain(['ProductReview', 'Users'])
            ->where(['Product.product_code' => $productCode])
            ->group('Product.id')
            ->toArray();

【讨论】:

  • @SterlingArcher 回答已编辑以解释为什么这样做。
  • 是的,我尝试了这段代码,得到了我想要的结果。但是,我得到了双倍的结果,这意味着在一个对象中产生了相同的结果,而我得到了两个对象。我不知道为什么
  • @EricLee 我认为您在 Products 和 ProductReviews 之间有很多关系,您可以按 Products.id 对结果进行分组,回答已编辑
  • 是的。他们有很多关系。谢谢你,我猜对了