0

我正在使用 CakePHP 3.2。

我有categories, products,seller_products表和它们的关联是

categories->hasMany('Products');
seller_products->hasMany('Products');

我必须按类别检索所有产品组,其中 Seller_products.stock > 0

这就是我正在做的

$pros1 = $this->Products->Categories->find()
          ->where([
            'Categories.status' => 0,
          ])
          ->contain([
            'Products.SellerProducts', 'Subcategories', 'Subcategories.ProductTypes'
          ])
          ->matching('Products.SellerProducts', function(\Cake\ORM\Query $q) {
            return $q->where(['SellerProducts.stock >' => 0]);
          });

但在调试时,它两次返回相同的值。 foreach($pros1 as $p){debug($p);}两次打印相同的值

/src/Controller/PagesController.php (line 120)

object(App\Model\Entity\Category) {

    'id' => (int) 1,
    'title' => 'Electronics',
    'description' => '',
    'icon' => 'fa-television',
    'status' => (int) 0,
    'created' => object(Cake\I18n\Time) {
       .........
     }

/src/Controller/PagesController.php (line 120)

object(App\Model\Entity\Category) {

    'id' => (int) 1,
    'title' => 'Electronics',
    'description' => '',
    'icon' => 'fa-television',
    'status' => (int) 0,
    'created' => object(Cake\I18n\Time) {
       .........
     }

debug(count($pros1))打印 1

4

1 回答 1

1

从文档中引用:

由于此函数将创建一个INNER JOIN,您可能需要考虑调用distinctfind 查询,因为如果您的条件尚未排除它们,您可能会得到重复的行。例如,当同一用户对一篇文章多次评论时,可能就是这种情况。

Cookbook > Database Access & ORM > Query Builder > 按关联数据过滤

在您的情况下,有多个匹配的产品属于同一类别。因此,要么对表的主键使用不同的选择,要么按它分组(两者之间可能没有区别)。

$pros1 = $this->Products->Categories
    ->find()
    ->distinct('Categories.id')
    // ...
    // ...
    ->matching(/* ... */)
    ->group('Categories.id');

也可以看看

于 2016-08-17T11:00:06.820 回答