Как добавить сложное предложение where в Zend Table Select?
Я искал в Интернете и не мог найти ничего, что могло бы показать мне хороший пример. Мой вопрос в основном таков:
Как это сделать:
SELECT * FROM table WHERE ((a = 1 AND b = 2) ИЛИ (c = 3 OR c = 4)) И d = 5;
Синтаксис Zend, подобный этому:
$this-
- > выберите()
- > от ($ это -. ''. > _ Схема $это → _ имя)
- > где ('a =?', '1');
Итак, как это можно сделать?
Большое спасибо заранее.
Ответы
Ответ 1
У меня была аналогичная проблема. См. Пример кода в ответе здесь: Группировка предложений 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
В сообщении на веб-сайте Zend Framework это может быть невозможно.
Мне кажется, что where() и orWhere() в классе Zend_Db_Select недостаточно, чтобы писать все запросы. Он не поддерживает вложение условий, что не позволяет пользователю абстрагироваться в несколько более сложных случаях. С где() и илиWhere() я не могу написать это:
Ответ 3
1) Создайте условие для всех групп Where/orWhere:
$conditions = $this->select()
->where('a= ?', 5)
->orWhere('b= ?', 6)
->getPart(Zend_Db_Select::WHERE);
// result: $conditions = "(a= 5) OR (b= 6)";
Используйте метод getPart() для получения условия where.
2) Затем reset часть текущего объекта select:
$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
Ответ 4
Edit
Функциональность массива 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));
Забастовкa >