2014-10-22 2 views
1

Я строю форму поиска подержанных автомобилей. В форме пользователь может выбрать флажки для опций, которые должен иметь автомобиль. Поскольку пользователь может выбрать несколько параметров, мне нужно найти автомобиль, у которого есть все параметры, которые выбрал пользователь.Запрос Doctrine QueryBuilder: имеет несколько ассоциаций

Я пытаюсь создать запрос, который проверяет, имеет ли «автомобиль» выбранные параметры. Сейчас им возможность проверить, если автомобиль имеет один из выбранных вариантов, выполнив:

// 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; 
     } 

Но когда я изменить «ORX» с результатом «AndX» всегда возвращается пустым.

Коды символов выше являются частью большей функции.

+0

Пробовали ли вы $ queryBuilder-> andWhere ('option.id в (: значение)') -> setParameter ('значение', $ значение) –

+0

Да, я пробовал, но это приводит к тому же, что я высказал выше. – Arne

ответ

0

Мне, наконец, удалось заставить его работать. Хитрость заключалась в использовании подзапроса:

$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 
Смежные вопросы