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

Как мне построить запрос, чтобы я мог параметризовать несколько полей в 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 ','

I 'используя Doctrine 2.6.1.

1 Ответ

0 голосов
/ 30 мая 2018

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

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

select * from users where (id, email) IN ((1, 2), ('foo@gmail.com', 'bar@gmail.com'));

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

select * from users where id IN(1,2) AND email IN('foo@gmail.com', 'bar@gmail.com');

Начиная с 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 использует ключи намного лучше с этим методом.

...