此方法作为正式示例发布
- > where(“price< $ minimumPrice OR price> $ maximumPrice”) 这种方法安全吗?
想把它写成 - > where(“price<?OR price>?”,$ minimumPrice,$ maximumPrice) 有什么可能吗?
我无法将其拆分为2个where语句,因为计划编写查询 - > where(“1 OR 2”) - > where(“3 OR 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));