向Zend_Db_Select添加复杂的WHERE条件

3

可能是重复问题:
Zend Framework复杂的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)')

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

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


我进行了一些研究,并发现这篇帖子建议使用getPart,但尚未测试。 - Mark Byers
看起来似乎可以工作,但相当违反直觉。 - Wolfgang Stengel
1个回答

4

有没有办法以纯流畅的风格完成这个任务?

简短回答:没有。

正如您提到的,您可以使用 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,如这里所示。

1
@WolfgangStengel:我认为你没有错过什么,而是这个API缺少了一些东西。 - Mark Byers
那正是我担心的事情。谢谢。 - Wolfgang Stengel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接