将复杂的WHERE条件添加到Zend_Db_Select

时间:2012-08-14 21:35:07

标签: php sql zend-framework

  

可能重复:
  Zend Framework Complex Where Statement

如何在仍然使用引号的情况下将这样的内容添加到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等是用户生成的输入)。

有没有办法以纯粹流利的方式做到这一点?

1 个答案:

答案 0 :(得分:4)

  

有没有办法以纯粹流利的方式做到这一点?

简答:不。

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

  

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

然而,按你希望的方式not possible to nest AND and OR conditions

如果你这样写:

->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作为演示here