2010-04-14 14 views
10

Busqué en la Web y no pude encontrar nada que me diera un buen ejemplo sólido. Mi pregunta es básicamente el siguiente:¿Cómo agrego la cláusula complex where a Zend Table Select?

¿Cómo convierto esto:

SELECT * FROM tabla WHERE ((A = 1 y B = 2) o (c = 3 o C = 4)) y D = 5 ;

Para la sintaxis Zend similar a esto:

$ este -> seleccionar() -> a partir de (. - ''. $ This> _ esquema de $ this -> _ nombre) -> donde (' a =? ',' 1 ');

Entonces, ¿cómo se puede hacer?

Muchas gracias de antemano.

Respuesta

14

que tenía un problema similar. Vea el ejemplo de código en la respuesta aquí: Grouping WHERE clauses with Zend_Db_Table_Abstract

Por lo que terminaría con algo como:

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

que le daría:

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

Eso podría funcionar. Necesito probarlo. –

1

Por un message board post en el sitio web de Zend Framework, esto puede no ser posible.

Me parece que donde() y orWhere() en la clase Zend_Db_Select no son suficientes para poder escribir todas las consultas. No es compatible con la anidación de condiciones, lo que no obliga al usuario con la abstracción en casos algo más complejos. Con el lugar donde() y orWhere() No puedo escribir esto:

0

Editar

La funcionalidad gama de Zend_Db_Select->where está diseñado sólo para usarlo con la cláusula 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); 

original

Como Peder dijo que no se puede anidar orWhere pero se puede pasar múltiples argumentos en where y 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. Esto reemplazará cada '?' Con el contenido 'array (1,2,3,4)' dando como resultado una tabla 'SELECT 'de consulta". "Col" FROM "table" WHERE ((a = 1, 2, 3, 4 AND b = 1, 2, 3, 4) O (c = 1, 2, 3, 4 O c = 1, 2, 3, 4)) AND (d = 5) ' –

+0

Tiene razón. Me parece recordar a alguien que muestra esta "característica" en Stack Overflow hace un tiempo. – Ballsacian1

+0

Entonces, no hay forma de hacer esto con where o orWhere functions? –

1

1) Construir una condición para todos los grupos Dónde/o dónde:

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

Utilice el método getPart() para obtener la condición where.

2) A continuación, restablezca el que parte del objeto de selección actual:

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

3) Por último, el uso donde la condición que desee:

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

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