2010-04-14 15 views
10

Ho cercato sul Web e non ho trovato nulla che potesse mostrarmi un buon esempio valido. La mia domanda è fondamentalmente questo:Come aggiungere una clausola where complessa a Zend Table Select?

Come faccio a convertire questo:

SELECT * FROM tabella WHERE ((a = 1, b = 2) oppure (c = 3 o c = 4)) e D = 5 ;

Per sintassi Zend simile a questo:

$ questo -> selezionare() -> da (. - ''. $ This> _ schema di $ this -> _ nome) -> dove (' a =? ',' 1 ');

Quindi, come può essere fatto?

Grazie mille in anticipo.

risposta

14

Ho avuto un problema simile. Vedere l'esempio di codice nella risposta qui: Grouping WHERE clauses with Zend_Db_Table_Abstract

Così si finirebbe con qualcosa di simile:

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

che darebbe:

SELECT `table_name`.* FROM `table_name` WHERE ((a = 1 AND b = 2) OR (c = 3 OR c = 4)) AND (d = 5) 
+0

Potrebbe funzionare. Devo provarlo. –

1

Per un message board post sul sito Web di Zend Framework, questo potrebbe non essere possibile.

Mi sembra che where() e orWhere() nella classe Zend_Db_Select non siano sufficienti per scrivere tutte le query. Non supporta l'annidamento di condizioni, che non impone all'utente di astrarre in casi un po 'più complessi. Con dove() e orWhere() Non posso scrivere questo:

0

Modifica

La funzionalità di matrice Zend_Db_Select->where è progettata solo per l'uso con la clausola 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); 

originale

Come Peder detto che non è possibile nido orWhere ma è possibile passare più argomenti in where e 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. Questo sostituirà ogni '?' Con il contenuto 'array (1,2,3,4)' risultante in una query '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)) E (d = 5) ' –

+0

Sei corretto. Mi sembra di ricordare che qualcuno abbia mostrato questa "caratteristica" su Stack Overflow qualche tempo fa. – Ballsacian1

+0

Quindi, non c'è modo di farlo con where or ohere dove funziona? –

1

1) Costruire una condizione per tutti i gruppi Where/orWhere:

Utilizzare il metodo getPart() per ottenere la condizione where.

2) Successivamente, ripristinare la cui parte della corrente oggetto di selezione:

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

3) Infine, usare dove condizioni come si desidera:

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

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

Problemi correlati