Doctrine Query Builder: несколько параметризованных полей, например (a.field1, a.field2) IN ((1,1), (2, 2))

Как создать запрос, чтобы можно было параметризовать несколько полей в QueryBuilder следующим образом:

$qb->andWhere('(a.field1, a.field2) IN ((1, 1), (2, 2))');

В приведенном выше примере возникает ошибка:

Doctrine\ORM\Query\QueryException : [Syntax Error] line 0, col 84: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got ','

Я использую Doctrine 2.6.1.

Возможный дубликат Symfony2 Doctrine querybuilder, где IN

ficuscr 29.05.2018 23:36

Или, stackoverflow.com/questions/18536190/… О, и это действительно о WHERE IN, попытка сделать два за один раз просто не сработает. Используйте where->(field1..., andWhere->(field2...

ficuscr 29.05.2018 23:37

Это не повторяющийся вопрос. Возможный повторяющийся вопрос не касается нескольких соответствующих полей.

Aimee 30.05.2018 00:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
66
1

Ответы 1

Думаю, на главную часть о том, как использовать WHERE IN, уже много раз ответили.

Попытка объединить два таких критерия не сработает. Точно так же этот SQL никогда не будет работать:

select * from users where (id, email) IN ((1, 2), ('[email protected]', '[email protected]'));

Вы бы написали это как

select * from users where id IN(1,2) AND email IN('[email protected]', '[email protected]');

Начиная с версии 2.5, я считаю, что вам нужно:

$qb->andWhere('a.field1 IN (:fieldOneValues)')
  ->andWhere('a.field2 IN (:fieldTwoValues)')
  ->setParameter('fieldOneValues', $fieldOneValues)
  ->setParameter('fieldTwoValues', $fieldTwoValues);

Обновлено:

Теперь я лучше понимаю. SQL, которым я поделился, показывает, что я не понимал этого синтаксиса. Со сколькими ценностями вы тестируете? Могли бы вы подойти к этому так же?

(a.field1 = 1 AND a.field2 = 1) OR (a.field1 = 2 AND a.field2 = 2)

Выполнение explain по запросу казалось, что MySQL использует ключи намного лучше с этим методом.

Однако этот запрос может привести к неожиданным результатам. Рассмотрим эти два запроса, которые дадут разные результаты: «select * from tbl WHERE (a, b) IN ((2, 1), (1, 2))» против «select * from tbl WHERE a in (2, 1 ) И b в (1, 2) "

Aimee 30.05.2018 00:01

Я в замешательстве. Первый вариант выглядит неверным синтаксисом. Вы ищете OR, а не AND? Вы понимаете группировку скобками?

ficuscr 30.05.2018 00:02

Вау, глядя на stackoverflow.com/questions/44706196/… Клянусь, я получил ошибку о "двух операндах", когда тестировал это. Хорошо узнавайте что-то новое каждый день. Могу сказать, что за более чем 20 лет разработки я никогда этим не пользовался.

ficuscr 30.05.2018 00:04

Да, я пытаюсь заставить Doctrine работать с несколькими столбцами для IN, чтобы она не возвращала неожиданных результатов. : D

Aimee 30.05.2018 00:05

Доктрина с этим не справится. Я бы просто написал необработанный SQL и использовал RSM, если нужно было возвращать реальные объекты.

ficuscr 30.05.2018 00:07

Я могу просто пойти с stackoverflow.com/a/44706402/6950851 и перевести его на DQL.

Aimee 30.05.2018 00:07

Я все еще пытаюсь осмыслить эту логику ... оба поля находятся в обоих наборах, верно? Не работает, как я ожидал. Извините, этот ответ бесполезен. Удачи! ... о, теперь я понял ... и почему я получил ошибку операнда, а не то, что я ожидал сначала

ficuscr 30.05.2018 00:13

Другие вопросы по теме