【问题标题】:Zend_db_Select multiple where but with variable clauses possible?Zend_db_Select 多个 where 但可以使用可变子句?
【发布时间】:2012-06-20 19:37:16
【问题描述】:

是否可以动态创建带有多个 where() 子句的 select 语句?假设一个函数接受多个参数。如果第 N 个参数不为空,则在语句中添加 ->where('sth = ?", $value) 子句并对所有参数执行此操作。

现在,最简单的方法是使用一个巨大的开关盒,但感觉不对。如果 where() 子句接受数组,那会很容易,但现在呢?

谢谢!

【问题讨论】:

  • 你试过是否可行?我的意思是它可能只是工作。文档对此有何说明?您尚未链接任何文档。唔。您的问题可以从源代码的某些格式中受益,使其更易于阅读。我的 2 美分。
  • 这些子句应该添加为AND还是OR条件?将数组作为绑定参数怎么样?
  • @hakre: 不需要“文档”,如果你熟悉 zend_db,我的意思就很明显了。此外,没有什么可以尝试查看“它是否有效”,这是一个悬而未决的问题。

标签: php zend-framework zend-db zend-db-select


【解决方案1】:

我在评论中指出,实现通用 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 标准包中没有包含它的原因 - 至少目前是这样。

【讨论】:

  • 清晰明了!谢谢你:)
【解决方案2】:

如果有人正在寻找替代方案(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 条件中具有不同的列条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2017-05-07
    相关资源
    最近更新 更多