【问题标题】:Doctrine Query Builder: multiple parameterized fields, such as (a.field1, a.field2) IN ((1,1), (2, 2))Doctrine Query Builder:多个参数化字段,例如 (a.field1, a.field2) IN ((1,1), (2, 2))
【发布时间】:2018-11-08 15:13:44
【问题描述】:

如何构建查询,以便可以像这样参数化 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。

【问题讨论】:

标签: php doctrine-orm doctrine


【解决方案1】:

思考主要部分关于如何使用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 通过这种方法更好地利用了键。

【讨论】:

  • 该查询可能会产生意想不到的结果。考虑这两个查询,它们会产生不同的结果:"select * from tbl WHERE (a, b) IN ((2, 1), (1, 2))" 与 "select * from tbl WHERE a in (2, 1 ) AND b in (1, 2)"
  • 我很困惑。第一个似乎是无效的语法。您是否在寻找 OR 而不是 AND?你明白用括号分组吗?
  • 哇,看着stackoverflow.com/questions/44706196/… 发誓我在测试时遇到了关于“两个操作数”的错误。每天都学点新东西。可以说,在 20 多年的开发中,我从未使用过它。
  • 是的,我正在尝试让 Doctrine 处理 IN 的多个列,这样它就不会返回意外结果。 :D
  • 我仍在试图围绕这个逻辑思考......这两个字段都在两个集合中,对吗?没有像我期望的那样工作。抱歉,这个答案没有帮助。祝你好运! ...哦,我现在明白了...以及为什么我得到了操作数错误,而不是我最初的预期
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多