zf2 zend framework zend-framework zend-db zend-db-table

zend framework - framework - ¿Cómo agrego la cláusula complex where a Zend Table Select?



zend framework db limit (4)

Según una publicación de tablero de mensajes 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 where () y orWhere () no puedo escribir esto:

Busqué en la Web y no pude encontrar nada que me mostrara un buen ejemplo sólido. Mi pregunta es básicamente esta:

¿Cómo convierto esto?

SELECCIONAR * DE la tabla DONDE ((a = 1 AND b = 2) O (c = 3 OR c = 4)) AND d = 5;

Zend sintaxis similar a esto:

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

Entonces, ¿cómo se puede hacer?

Muchas gracias en avanzado.


Editar

La funcionalidad de matriz de Zend_Db_Select->where está diseñada solo para usarla 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 puedes anidar ni a orWhere pero puedes pasar múltiples argumentos a 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) Crear una condición para todos los grupos Donde / o Donde:

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

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

2) Luego, restablece la parte donde del objeto seleccionado actual:

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

3) Por último, use la condición donde desee:

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

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


Tuve un problema similar. Vea el ejemplo del código en la respuesta aquí: Agrupando las cláusulas WHERE con Zend_Db_Table_Abstract

Entonces terminarías 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);

Lo cual te daría:

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