是否可以动态创建带有多个 where() 子句的 select 语句?假设一个函数接受多个参数。如果第 N 个参数不为空,则在语句中添加 ->where('sth = ?", $value) 子句并对所有参数执行此操作。
现在,简单的方法是使用一个巨大的开关盒,但感觉不对。如果 where() 子句接受数组,那会很容易,但现在呢?
谢谢!
是否可以动态创建带有多个 where() 子句的 select 语句?假设一个函数接受多个参数。如果第 N 个参数不为空,则在语句中添加 ->where('sth = ?", $value) 子句并对所有参数执行此操作。
现在,简单的方法是使用一个巨大的开关盒,但感觉不对。如果 where() 子句接受数组,那会很容易,但现在呢?
谢谢!
我在评论中指出,实现通用 WHERE 包装器并非易事:这就是为什么(我认为)ZF 开发人员决定采用更简单的方法,该方法基本上需要一个 SQL 表达式 - 而不是数组。
为您的案例实现这样的功能会更容易:
function whereX(Zend_Db_Select $select, array $args) {
foreach($args as $argExpression => $argValue) {
$select->where($argExpression, $argValue);
}
}
...然后通过这样的方式使用它...
whereX($select, array('price < ?' => $minimumPrice, 'price > ?' => $maximumPrice));
但是当您决定使用“OR”条件或制作一些更复杂的子句时,应该调整该功能。随着它变得越来越复杂,它的简单性变得越来越差......
我想这就是为什么它不包含在 Zend 标准包中的原因——至少目前是这样。
如果有人正在寻找替代方案(Zend Framework 1.12.3):
$where = array();
foreach($delete_ids as $delete_cond)
$where[]=$db_adapter->quoteInto ('id=?', $delete_cond);
$where = implode(' OR ', $where);
$where = '('.$where.') AND '.$db_adapter->quoteInto('somethingEse=?', $something);
这将为您提供以下结果:
WHERE (as many OR conditions as you like of the **same** column) AND (single condition that must
also be met)
您可以使用 raina77ow 的答案对其进行一些调整,以便在 OR 条件中具有不同的列条件。