Как добавить сложное предложение where в Zend Table Select? - PullRequest
11 голосов
/ 14 апреля 2010

Я искал в Интернете и не смог найти ничего, что показало бы мне хороший солидный пример. Мой вопрос в основном такой:

Как мне преобразовать это:

ВЫБОР * ИЗ таблицы ГДЕ ((a = 1 И b = 2) ИЛИ (c = 3 ИЛИ c = 4)) И d = 5;

Чтобы Zend синтаксис похож на это:

$ это -> выберите () -> от ($ это -. ''.> _ Схема $ это -> _ имя) -> где ('a =?', '1');

Так как это можно сделать?

Заранее большое спасибо.

Ответы [ 4 ]

14 голосов
/ 15 апреля 2010

У меня была похожая проблема. См. Пример кода в ответе здесь: Группировка предложений WHERE с Zend_Db_Table_Abstract

Таким образом, вы получите что-то вроде:

$db = $this->getAdapter();
$this->select()
     ->where('(' . $db->quoteInto('a = ?', 1) . ' AND ' . $db->quoteInto('b = ?', 2) . ') OR (' . $db->quoteInto('c = ?', 3) . ' OR ' . $db->quoteInto('c = ?', 4) . ')')
     ->where('d = ?', 5);

Что даст вам:

SELECT `table_name`.* FROM `table_name` WHERE ((a = 1 AND b = 2) OR (c = 3 OR c = 4)) AND (d = 5)
2 голосов
/ 26 марта 2014

1) Постройте условие для всех групп. Где / или Где:

$conditions = $this->select()
        ->where('a= ?', 5)
        ->orWhere('b= ?', 6)
        ->getPart(Zend_Db_Select::WHERE);
// result: $conditions = "(a= 5) OR (b= 6)";

Используйте метод getPart (), чтобы получить условие where.

2) Затем сбросьте часть текущего объекта выбора:

$this->select()->reset(Zend_Db_Select::WHERE);

3) Наконец, используйте, где вы хотите, условие:

$this->select()
    ->where('d= ?', 5)
    ->where(implode(' ', $conditions));

http://framework.zend.com/manual/1.12/ru/zend.db.select.html

1 голос
/ 14 апреля 2010

За сообщение на доске объявлений на веб-сайте Zend Framework, это может быть невозможно.

Мне кажется, что where () и orWhere () в классе Zend_Db_Select недостаточно, чтобы иметь возможность писать все запросы. Он не поддерживает вложение условий, что не навязывает пользователю абстракцию в несколько более сложных случаях. С помощью where () и orWhere () я не могу написать это:

0 голосов
/ 14 апреля 2010

Редактировать

Функциональность массива Zend_Db_Select->where предназначена только для использования с предложением IN.

Example #17 Example of an array parameter in the where() method
// Build this query:
//   SELECT product_id, product_name, price
//   FROM "products"
//   WHERE (product_id IN (1, 2, 3))

$productIds = array(1, 2, 3);

$select = $db->select()
             ->from('products',
                    array('product_id', 'product_name', 'price'))
             ->where('product_id IN (?)', $productIds);

Оригинал

Как сказал Педер, вы не можете вкладывать orWhere, но вы можете передать несколько аргументов в where и orWhere.

$this->select()
  ->from($this->_schema.'.'.$this->_name)
  ->where(' ( a = ? AND b = ? ) OR ( c = ? OR c = ? ) ', array(1,2,3,4))
  ->where('d = ?',array(5));

...