Использование andWhere и orWhere в Doctrine: синтаксис и примеры
Быстрый ответ
Запомните важные моменты: используйте andWhere для сцепления фильтров и orWhere для установки альтернатив. Работая с QueryBuilder, вы можете с легкостью их применять:
$queryBuilder->where('alias.column1 = :value1')
->setParameter('value1', $value1)
->andWhere('alias.column2 = :value2') // К запросу добавляется второй столбец
->setParameter('value2', $value2)
->orWhere('alias.column3 = :value3') // Третий столбец вводит новые условия
->setParameter('value3', $value3)
->orWhere('alias.column4 = :value4'); // Четвертый столбец дополняет условия
andWhere требует выполнения всех условий, в то время как orWhere требует выполнения хотя бы одного из условий.

Создание сложных условий
Вы — профессионал, которому приходится иметь дело со сложными запросами. Как совмещать andWhere и orWhere вместе? Для этого предназначен класс Expr!
Соединение условий при помощи вложенных структур
Для определения условий следует использовать методы ->expr()->andX() и ->expr()->orX(). Это позволяет соединять правила и создавать вложенные запросы как элементы единой системы.
$queryBuilder->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('alias.column1', ':value1'),
$queryBuilder->expr()->orX(
$queryBuilder->expr()->eq('alias.column2', ':value2'),
$queryBuilder->expr()->like('alias.column3', ':value3')
)
)
);
Динамическое добавление условий
Иногда условия запроса формируются исходя из текущих задач. В таких случаях можно подготовить массив условий и использовать цикл для их добавления. Этот подход напоминает создание списка покупок.
$conditions = [...]; // Подготавливаем набор условий.
$composite = $queryBuilder->expr()->orX();
foreach ($conditions as $condition) {
$composite->add($condition); // Дополняем список условий
}
$queryBuilder->where($composite); // Передаем конкретный запрос на выполнение
Работа с значениями, сравнением и прочим
Используйте ->expr()->eq() для сравнения, ->expr()->like() для поиска по шаблону и ->expr()->literal() для работы с литералами. Эти инструменты делают ваш запрос более точным.
$queryBuilder->where(
$queryBuilder->expr()->eq('alias.column', $queryBuilder->expr()->literal('SomeValue'))
);
Визуализация
andWhere требует выполнения всех условий, поэтому его стоит использовать, когда важно учесть все критерии.
orWhere предполагает выполнение любого из условий, подобно обсуждению вопроса о наличии ананасов на пицце — за или против.
Создание запросов с andWhere и orWhere можно сравнить с приготовлением пиццы: andWhere нужен для полного соответствия всем пожеланиям, а orWhere требует выполнения хотя бы одного из условий.
Повышение производительности и избегание ловушек
Важно избегать избыточности запросов и использовать параметры для защиты от SQL-инъекций. Также следует выбирать правильный способ извлечения данных — иногда работа с массивом эффективнее, чем с полными объектами.
Несколько разумных советов и хитростей
Используйте функцию getNewCriterion в Propel для идей по оптимизации условий в Doctrine. Не забывайте об изучении документации Doctrine, которая содержит множество примеров и передовых практик.
Полезные материалы
- QueryBuilder – путеводитель по ORM Doctrine — развернутое руководство по работе с
QueryBuilder. - Введение – коллекции Doctrine — обзор использования
CriteriaдляandWhereиorWhere.