Как добавить сложное предложение where в Zend Table Select?

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

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

ВЫБРАТЬ * ИЗ таблицы WHERE ((a = 1 AND b = 2) OR (c = 3 OR c = 4)) AND d = 5;

Для Zend синтаксис похож на этот:

$ this -> select () -> from ($ this -> _ schema. '.'. $ this -> _ name) -> where ('a =?', '1');

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

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


person AD.    schedule 14.04.2010    source источник


Ответы (4)



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) Наконец, используйте условие where по своему усмотрению:

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

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

person Jorik    schedule 26.03.2014

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

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

person Peder Rice    schedule 14.04.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));

person Ballsacian1    schedule 14.04.2010
comment
-1. Это заменит каждый ? содержимым array(1,2,3,4), что приведет к запросу SELECT "table"."col" FROM "table" WHERE ( ( a = 1, 2, 3, 4 AND b = 1, 2, 3, 4 ) OR ( c = 1, 2, 3, 4 OR c = 1, 2, 3, 4 ) ) AND (d = 5) - person Luiz Damim; 14.04.2010
comment
Ты прав. Кажется, я помню, как кто-то недавно показывал эту функцию на Stack Overflow. - person Ballsacian1; 15.04.2010
comment
Итак, нет возможности сделать это с помощью функций where или orWhere? - person AD.; 15.04.2010