【问题标题】:Zend Framework Complex Where StatementZend Framework Complex Where 语句
【发布时间】:2010-10-10 09:42:44
【问题描述】:

此方法作为官方示例发布

->where("价格 $maximumPrice") 这种方法安全吗?

想写成 ->where("price ?", $minimumPrice, $maximumPrice) 有没有可能?

我不能将它分成 2 个 where 语句,因为计划编写查询 ->哪里(“1或2”) ->where("3 OR 4")

【问题讨论】:

标签: zend-framework zend-db


【解决方案1】:

试试这个:

$query->where('(price < ?', $minPrice)
->orWhere('price > ?)', $maxPrice)
->where('some = ?', $some_other_variable);

将导致: where ((price &lt; $minPrice) OR (price &gt; $maxPrice)) AND (some = $some_other_variable)

注意 OR 部分的双 (( ))

【讨论】:

  • 这不合适 - 我需要这样写结构 ->where(->where(1) 或 ->where(2)) ->where(->where(3) 或 - >哪里(4))
【解决方案2】:

如果我有复杂的 WHERE 子句,我会使用 db 适配器的 -&gt;quoteInto() 方法,例如:

$where = '('
           . $dbAdapter->quoteInto('price1 < ?', $price1)
           . ' OR '
           . $dbAdapter->quoteInto('price1 > ?', $price1)
       . ')'
       . ' AND '
       . '('
           . $dbAdapter->quoteInto('price2 < ?', $price2)
           . ' OR '
           . $dbAdapter->quoteInto('price2 > ?', $price2)
       . ')'
       ;

$select->where($where);

【讨论】:

  • 这是有效的变体,但效果不好:)
【解决方案3】:

有时您会想要在多个 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 并没有让你的生活变得很轻松。

【讨论】:

    【解决方案4】:
    $select->where($db->quoteInto('field1 < ? OR', $minPrice)
                 . $db->quoteInto('field1 > ?', $maxPrice))
           ->where($db->quoteInto('field2 < ? OR', $value2)
                 . $db->quoteInto('field2 > ?', $value3));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多