向Zend_Db_Select添加复杂的 WHERE 条件


Adding complex WHERE conditions to a Zend_Db_Select

可能的重复项:
Zend框架复合体在哪里语句

如何在使用引用的同时将这样的东西添加到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 等是用户生成的输入)。

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

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

简短的回答:不。

如前所述,您可以使用orWhere来编写条件,例如 (a = ?) OR (b = ?) .

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

但是,不可能以

您希望的方式嵌套ANDOR条件。

如果你写了这个:

->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