2

可能重复:
Zend Framework Complex Where 语句

如何在仍然使用引用的同时将这样的内容添加到 Zend_Db_Select 中?

SELECT x FROM y WHERE (a=1 OR b=2) AND (c=3 OR d=4)

我见过 where() 和 orWhere(),但我看不到用括号将它们分组的方法。我意识到我可以这样写:

->where('(a=1 OR b=2) AND (c=3 OR d=4)')

但理想情况下,我希望对 where() 进行 4 次单独调用,以便能够使用第二个参数进行引用(假设值 1、2、3 等是用户生成的输入)。

有没有办法以纯流利的风格做到这一点?

4

1 回答 1

4

有没有办法以纯流利的风格做到这一点?

简短的回答:没有。

正如您所提到的,您可以使用orWhere编写条件,例如(a = ?) OR (b = ?).

Zend_Db_Select 自动为您使用 where() 或 orWhere() 方法指定的每个表达式加上括号。这有助于确保布尔运算符优先级不会导致意外结果。

但是,不可能以您希望的方式嵌套AND和设置OR条件

如果你这样写:

->where('a=?', $a)
->orWhere('b=?', $b)
->where('c=?', $c)
->orWhere('d=?', $d)

这将导致类似于此的 SQL:

(a=1) OR (b=2) AND (c=3) OR (d=4)

这将被解释如下(不是你想要的):

(a=1) OR ((b=2) AND (c=3)) OR (d=4)

备择方案:

  • 手写SQL。
  • 如此处quoteInto所示使用。
于 2012-08-14T21:39:52.820 回答