【问题标题】:Symfony Doctrine One to Many andX query builderSymfony Doctrine 一对多和 X 查询构建器
【发布时间】:2020-11-03 17:37:22
【问题描述】:

我有一个具有 OneToMany AttributeValues 的 Product 实体。每个AttributeValue,都有一个Attribute关系和一个“value”参数。

我想过滤同时具有“颜色”(属性)“黑色”(值)和“尺寸”“2m”的产品。

        $qb->leftJoin("product.attrVal","attrVal");
        $andX = $qb->expr()->andX();
        $count = 0;
        foreach($params['filters'] as $att_id => $values) {
            foreach ($values as $val){
                $andX->add("attrVal.attribute = :att_id_".$count." and attrVal.value = :val_".$count);
                $qb->setParameter("att_id_".$count, $att_id);
                $qb->setParameter("val_".$count, $val);
                $count++;
            }

        }
        $qb->andWhere($andX);
    

当然,这只有在只给出一个属性时才有效。如果过滤器数组包含多个值,则不会给出任何结果。可能是因为它正在寻找满足同一 AttributeValue 对象的所有条件,而不是寻找满足至少一个条件的所有 AttributeValue 对象。但我的最终目标是一次找到具有所有给定属性的对象。但无法弄清楚如何在查询生成器中说明这一点。

谢谢!

【问题讨论】:

    标签: doctrine query-builder


    【解决方案1】:

    我找到了解决方案。也许它不是最好的,但它确实有效。

    我从内部加入我的属性开始并计算它们。

        $qb->from($this->_entityName, 'product')    
        $qb->addSelect('product')    
        $qb->innerJoin("product.attributes","attributes");
        $qb->addSelect('COUNT(attributes.id) AS attributesCount');
        $qb->groupBy('product.id');
    

    然后我添加一个 orX 而不是 andX,以获取所有具有至少一个属性的产品。

        $orX = $qb->expr()->orX();
        $count = 0;
        foreach($params['filters'] as $att_id => $values) {
            foreach ($values as $val){
                $orX->add("attributes.attribute = :att_id_".$count." and attributes.value = :val_".$count);
                $qb->setParameter("att_id_".$count, $att_id);
                $qb->setParameter("val_".$count, $val);
                $count++;
            }
    
        }
        $qb->andWhere($orX);
    

    最后,我确保只返回计算所有已定义属性的值。过滤掉不具备所有属性的产品。

        $qb->having("attributesCount = :ac");
        $qb->setParameter("ac", $count);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      相关资源
      最近更新 更多