Некоторые времена вы хотите сделать запросы SQL, которые имеют круглые скобки вокруг нескольких, где условия, которые будут легко разобраны с Еогеасп, но вы не хотите быть беспокоился о строковых манипуляциях. Например, вы бы список пользователей с идентификаторами и что должны быть определенного типа, вы можете попробовать это:
$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 таблицы 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, $ операндов = массив () по умолчанию как '=?' и т. д., но для простоты я оставил это. Но я считаю, что мы должны использовать собственные SQL-функции, такие как IN(), BETWEEN ... AND ..., NOT BETWEEN ... AND ...? Zend Framework не делает вашу жизнь очень легкой.
Я задал тот же вопрос раньше. См. Ответ Джейсона здесь: http://stackoverflow.com/questions/1179279/grouping-where-clauses-with-zend-db-table-abstract – Mark