2010-04-14 1 views
10

Я искал в Интернете и не нашел ничего, что могло бы показать мне хороший хороший пример. Мой вопрос заключается в основном это:Как добавить сложное предложение where в Zend Table Select?

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

SELECT * из таблицы, где ((а = 1 и В = 2) или (с = 3 или с = 4)) и г = 5 ;

Для Zend синтаксис, подобный следующему:

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

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

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

ответ

14

У меня была аналогичная проблема. Смотрите пример кода в ответ здесь: Grouping WHERE clauses with 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) 
+0

Это может сработать. Мне нужно попробовать. –

1

На сайт message board post на веб-сайте Zend Framework это может быть невозможно.

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

0

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

Функциональность массив 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)); 

+1

-1. Это заменит каждый '?' Массивом content (1,2,3,4) ', что приведет к таблице запроса SELECT". "Col" FROM "table" WHERE ((a = 1, 2, 3, 4 И b = 1, 2, 3, 4) ИЛИ (c = 1, 2, 3, 4 ИЛИ c = 1, 2, 3, 4)) И (d = 5) ' –

+0

Вы верны. Кажется, я помню, как кто-то показывал эту «функцию» в «Переполнении стека» некоторое время назад. – Ballsacian1

+0

Итак, нет способа сделать это с помощью функций where или orWhere? –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^