Zend Framework Complex Where Statement

时间:2010-10-10 09:42:44

标签: zend-framework zend-db

此方法作为正式示例发布

- > where(“price< $ minimumPrice OR price> $ maximumPrice”) 这种方法安全吗?

想把它写成 - > where(“price<?OR price>?”,$ minimumPrice,$ maximumPrice) 有什么可能吗?

我无法将其拆分为2个where语句,因为计划编写查询 - > where(“1 OR 2”) - > where(“3 OR 4”)

4 个答案:

答案 0 :(得分:2)

试试这个:

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

将导致: where ((price < $minPrice) OR (price > $maxPrice)) AND (some = $some_other_variable)

注意OR部分中的double(())

答案 1 :(得分:1)

如果我有复杂的WHERE子句,我使用数据库适配器'->quoteInto()方法,如:

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

$select->where($where);

答案 2 :(得分:1)

有时候你会想要进行SQL查询,这些查询的括号围绕多个条件,这些条件可以很容易地用foreach解析,但是你不想对字符串操作感到困扰。例如,您将拥有一个ID为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 ...,不要在...之间......和......? Zend Framework虽然不会让你的生活变得轻松。

答案 3 :(得分:1)

$select->where($db->quoteInto('field1 < ? OR', $minPrice)
             . $db->quoteInto('field1 > ?', $maxPrice))
       ->where($db->quoteInto('field2 < ? OR', $value2)
             . $db->quoteInto('field2 > ?', $value3));