Я использую PHP Doctrine ORM для построения своих запросов. Однако я не могу понять, как написать следующее предложение WHERE с использованием DQL (Doctrine Query Language):
WHERE name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
AND price > 10
Как мне указать, куда идут скобки?
То, что я сейчас имею в своем PHP-коде, таково:
->where('name = ?', 'ABC')
->andWhere('category1 = ?', 'X')
->orWhere('category2 = ?', 'X')
->orWhere('category3 = ?', 'X')
->andWhere('price > ?', 10)
Но это производит что-то вроде
WHERE name='ABC' AND category1 = 'X' OR category2 = 'X' OR category3 = 'X'
AND price > 10
, который в силу порядка операций не возвращает ожидаемых результатов.
Кроме того, есть ли разница между методами "где", "и где" и "addWhere"?
UPDATE
Хорошо, похоже, что вы не можете выполнять сложные запросы с использованием DQL, поэтому я пытался написать SQL вручную и использовать метод andWhere () для его добавления. Тем не менее, я использую WHERE..IN и Doctrine, кажется, удаляет мои заключающие в скобки:
$q->andWhere("(category1 IN $subcategory_in_clause
OR category2 IN $subcategory_in_clause
OR category3 IN $subcategory_in_clause)");