【问题标题】:CakePHP : query printing same values twiceCakePHP:查询两次打印相同的值
【发布时间】:2016-12-23 23:24:56
【问题描述】:

我正在开发 CakePHP 3.2。

我有categoriesproductsseller_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

【问题讨论】:

    标签: cakephp cakephp-3.2


    【解决方案1】:

    引用自文档:

    由于此函数将创建一个INNER JOIN,您可能需要考虑 在查找查询上调用distinct,因为如果出现重复行,您可能会得到重复的行 您的条件尚未排除它们。可能是这种情况, 例如,当相同的用户在一个单一的 文章。

    Cookbook > Database Access & ORM > Query Builder > Filtering by Associated Data

    在您的情况下,有多个匹配的产品属于同一类别。因此,要么对表的主键使用不同的选择,要么按它分组 (there may be no difference between the two)。

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

    另见

    【讨论】:

    • 感谢 ndm。但匹配不起作用。它仍在显示带有SellerProducts.stock = 0的产品
    • @AnujTBE 这是一个不同的问题。这不是匹配的工作原理。匹配过滤父记录,如果您包含子记录 (SellerProducts) 并且只想要特定的记录,那么您也必须过滤它们。见stackoverflow.com/a/26800203/1392379
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多