一尘不染

Zend_Db使用多个AND OR运算符的复杂WHERE子句

sql

我想在Zend_Db中生成这个复杂的WHERE子句:

SELECT * 
FROM 'products' 
WHERE 
    status = 'active' 
    AND 
    (
        attribute = 'one' 
        OR 
        attribute = 'two' 
        OR 
        [...]
    )
;

我已经试过了:

$select->from('product');
$select->where('status = ?', $status);
$select->where('attribute = ?', $a1);
$select->orWhere('attribute = ?', $a2);

并且产生了:

SELECT `product`.* 
FROM `product` 
WHERE 
    (status = 'active') 
    AND 
    (attribute = 'one') 
    OR 
    (attribute = 'two')
;

我确实找到了一种完成这项工作的方法,但是我觉得通过使用PHP先组合“ OR”子句,然后再使用Zend_Db
where()子句将它们组合起来,这是一种“欺骗”。PHP代码:

$WHERE = array();
foreach($attributes as $a):
    #WHERE[] = "attribute = '" . $a . "'";
endforeach;
$WHERE = implode(' OR ', $WHERE);

$select->from('product');
$select->where('status = ?', $status);
$select->where($WHERE);

产生了我想要的东西。但是我很好奇,是否有一种“官方”方式可以通过使用Zend_Db工具来获取复杂的WHERE语句(实际上并不太复杂,只需添加一些括号),而不是先在PHP中进行组合。

干杯!


阅读 252

收藏
2021-03-10

共1个答案

一尘不染

这将是为您提供指定括号的“官方”方式(请参见Zend_Db_Select文档中的示例20
):

$a1 = 'one';
$a2 = 'two';
$select->from('product');
$select->where('status = ?', $status);
$select->where("attribute = $a1 OR attribute = $a2");

因此,鉴于您不知道自己提前拥有多少个属性,因此您所做的事情似乎很合理。

2021-03-10