中古車の検索フォームを作成しています。フォームでは、ユーザーは車に必要なオプションのチェックボックスを選択できます。ユーザーは複数のオプションを選択できるため、ユーザーが選択したすべてのオプションを備えた車を検索する必要があります。
'car'に選択されたオプションがあるかどうかをチェックするクエリを作成しようとしています。現在、次の手順を実行して、選択したオプションの1つが車にあるかどうかを確認できません。
// 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」に変更すると、結果は常に空で返されます。
上記のコードスニペットは、より大きな関数の一部です。
私はついにそれを機能させることができました。トリックはサブクエリを使用することでした:
$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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加