我想在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中进行组合。
干杯!
这将是为您提供指定括号的“官方”方式(请参见Zend_Db_Select文档中的示例20 ):
Zend_Db_Select
$a1 = 'one'; $a2 = 'two'; $select->from('product'); $select->where('status = ?', $status); $select->where("attribute = $a1 OR attribute = $a2");
因此,鉴于您不知道自己提前拥有多少个属性,因此您所做的事情似乎很合理。