doctrine QueryBuilder подзапрос

doctrine query builder Подзапрос (subquery) "SELECT * WHERE value IN (SELECT ...)"

SELECT column-names
FROM table-name1
WHERE value IN (SELECT column-name
       FROM table-name2 
        WHERE condition)

Такой подзапрос можно оформить с помощью QueryBuilder-а через expr()->in(). Например, так:

doctrine QueryBuilder -- Как передать параметр в подзапрос. expr->orX()

Как построить сложный подзапрос expr()->... смотри здесь.

Метод setParameter() нельзя включить в цепочку после добавления части подзапроса, т.к.

($qb->expr()->orX())->add()

не возвращает QueryBuilder-объект, чьим методом является setParameter().

Это создаёт проблему, когда мы заранее не знаем, передан ли тот или иной параметр в работу, и следовательно, будет ли добавлена соответствющая часть в подзапрос.

doctrine QueryBuilder -- Пример сложного запроса с подзапросом. expr->orX()

Задача

Написать сложный sql-запрос для поиска значений в таблице sale по нескольким фильтрам.

Сложность 1: не обязательно все фильтры переданы (могут быть null).
Сложность 2: несколько фильтров строгие (условия будут дополнять друг друга, необходимо найти пересечение результатов), а несколько - нестрогие (необходимо найти объединение результатов поиска по этим фильтрам). В итоге мы должны найти пересечение результатов поиска по первой группе фильтров и по второй.

Subscribe to RSS - doctrine QueryBuilder подзапрос