有时您会想要在多个 where 条件周围加上括号的 SQL 查询,这些条件可以很容易地用 foreach 解析,但您不想为字符串操作而烦恼。例如,您将有一个具有 id 并且必须属于特定类型的用户列表,您可以试试这个:
$select = $this->select();
$subWhere = $this->select();
foreach(array_keys($idArr) as $key => $value) {
$subWhere->orWhere('id=?', $value);
}
$select->where(implode(' ', $subWhere->getPart('WHERE')))->where('type=?', 'customer');
这将导致“SELECT * FROM table WHERE ((id=X) OR (id=Y) OR (id=Z)...) AND (type='customer');”
这个想法进一步发展,你可以扩展 Zend_Db_Table_Abstract:
public function subWhere($col, $binds, $operands, $andOr = 'OR' )
{
$subWhere = $this->select();
if(strtolower($andOr) == 'or') {
foreach($binds as $key => $value) {
$subWhere->orWhere($col.$operands[$key].'?', $value);
}
return implode(' ', $subWhere->getPart('WHERE'));
}
elseif (strtolower($andOr) == 'and') {
foreach ($binds as $key => $value) {
$subWhere->where($col.$operands[$key].'?', $value);
}
return implode(' ', $subWhere->getPart('WHERE'));
}
else {
return false;
}
}
并将其用作:
$this->select()->where($this->subWhere($col, $binds, $operands));
当然你应该允许混合 $cols, $operands = array() 默认为 '=?'等等,但为了简单起见,我把它省略了。但我相信我们应该使用原生 SQL 函数,如 IN()、BETWEEN ... AND ...、NOT BETWEEN ... AND ...? Zend Framework 并没有让你的生活变得很轻松。