Php 条令QueryBuilder查询:具有多个关联

Php 条令QueryBuilder查询:具有多个关联,php,symfony,doctrine-orm,zend-framework2,query-builder,Php,Symfony,Doctrine Orm,Zend Framework2,Query Builder,我正在建立一个二手车搜索表。在表单中,用户可以为汽车应有的选项选择复选框。因为用户可以选择多个选项,所以我需要搜索一辆包含用户选择的所有选项的汽车 我正在尝试构建一个查询,检查“car”是否具有所选的选项。现在,我可以通过执行以下操作来检查汽车是否具有所选选项之一: // The options filter is something special, the parameter is passed as a comma separated // String with options ids

我正在建立一个二手车搜索表。在表单中,用户可以为汽车应有的选项选择复选框。因为用户可以选择多个选项,所以我需要搜索一辆包含用户选择的所有选项的汽车

我正在尝试构建一个查询,检查“car”是否具有所选的选项。现在,我可以通过执行以下操作来检查汽车是否具有所选选项之一:

// The options filter is something special, the parameter is passed as a comma separated
// String with options ids
        if($param == 'car.options' && $optionsIds){
            $queryBuilder->leftJoin('car.options', 'option');
            $options        = $queryBuilder->expr()->orX();
            foreach(explode(',', $optionsIds) as $id) {
                $options->add($queryBuilder->expr()->eq('option.id', $id));
            }
            $wheres->add($options);
            continue;
        } 
但是当我用andX更改orX时,结果总是返回空的


上面的代码片段是一个更大函数的一部分。

我终于设法让它工作起来了。诀窍是使用子查询:

$carsWithSelectedOptions = $this->getEntityManager()->createQuery('
    SELECT c.id
    FROM Occasions\Model\Bo\Car AS c JOIN c.options o
    WHERE o.id IN ('.$optionsIds.')
    AND c.id = car.id
    GROUP BY c.id
    HAVING COUNT(o.id) >= '.count(explode(',', $optionsIds))
);

$wheres->add($queryBuilder->expr()->exists($carsWithSelectedOptions->getDQL()));
注意,这是一个较大查询的一部分。完整的查询结果为:

SELECT advert, customer, car, country, brand, model 
FROM Occasions\Model\Bo\Advert advert 
LEFT JOIN advert.customer customer 
LEFT JOIN advert.car car 
LEFT JOIN customer.country country 
LEFT JOIN car.model model 
LEFT JOIN car.brand brand 
WHERE EXISTS( 
    SELECT c.id FROM Occasions\Model\Bo\Car AS c 
    JOIN c.options o WHERE o.id IN (2,4,5,51) 
    AND c.id = car.id GROUP BY c.id HAVING COUNT(o.id) >= 4)
AND brand.id = :brandid 
AND model.id = :modelid
AND country.country_code = :countrycountry_code

你试过$queryBuilder->andWhere('option.id in(:value))->setParameter('value',$value)吗?是的,我试过了,但结果与我上面表达的一样。