2010-10-10 3 views
2

Этот метод опубликован в качестве примера OFFICALZend Framework комплекс Где Заявление

-> где ("цена < $ minimumPrice ИЛИ цена> $ maximumPrice") такой метод безопасен?

хотите написать его как -> где ("цена < ИЛИ цена>?", $ MinimumPrice, $ maximumPrice) есть ли poissibility?

и я не могу разделить его на 2, где заявления, потому что план написать запрос -> где ("1 OR 2") -> где ("3 ИЛИ 4")

+0

Я задал тот же вопрос раньше. См. Ответ Джейсона здесь: http://stackoverflow.com/questions/1179279/grouping-where-clauses-with-zend-db-table-abstract – Mark

ответ

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); 
+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)

Примечание двойной (()) ИЛИ часть

+0

Это не подходит. Мне нужно написать такую ​​конструкцию. -> где (-> где (1) или -> где (2)) -> где (-> где (3) или -> где (4)) –

1

Некоторые времена вы хотите сделать запросы 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 не делает вашу жизнь очень легкой.

1
$select->where($db->quoteInto('field1 < ? OR', $minPrice) 
      . $db->quoteInto('field1 > ?', $maxPrice)) 
     ->where($db->quoteInto('field2 < ? OR', $value2) 
      . $db->quoteInto('field2 > ?', $value3)); 
Смежные вопросы