Doctrine Symfony原则一对多andX查询生成器

Doctrine Symfony原则一对多andX查询生成器,doctrine,query-builder,Doctrine,Query Builder,我有一个产品实体,它有一个多属性值。每个AttributeValue都有一个属性关系和一个“值”参数 我想过滤同时具有“颜色”(属性)“黑色”(值)和“尺寸”的产品 当然,只有当只给出一个属性时,这才有效。如果过滤器数组包含多个值,则不会给出任何结果。可能是因为它希望满足同一AttributeValue对象上的所有条件,而不是寻找至少满足一个条件的所有AttributeValue对象。但我的最终目标是找到同时具有所有给定属性的对象。但是我不知道如何在查询生成器中声明 谢谢大家! 我找到了解决办法

我有一个产品实体,它有一个多属性值。每个AttributeValue都有一个属性关系和一个“值”参数

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

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


谢谢大家!

我找到了解决办法。也许这不是最好的,但它很管用

我首先将我的属性连接起来并计数

    $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);
最后,我确保只返回计算所有已定义属性的值。筛选出不具备所有属性的产品

    $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);