zend framework zend-framework zend-db-table

zend framework - framework - Agrupando las cláusulas WHERE con Zend_Db_Table_Abstract



zend framework db limit (5)

¿Alguien sabe de una forma de agrupar las cláusulas con Zend_Db? Básicamente tengo esta consulta

$sql = $table->select() ->where(''company_id = ?'', $company_id) ->where(''client_email = ?'', $client_email) ->orWhere(''client_email_alt = ?'', $client_email);

Lo cual me está dando esto:

SELECT `clients`.* FROM `clients` WHERE (company_id = ''1'') AND (client_email = ''[email protected]'') OR (client_email_alt = ''[email protected]'')

Pero necesito que me dé esto, donde la declaración O está agrupada:

SELECT `clients`.* FROM `clients` WHERE (company_id = ''1'') AND ((client_email = ''[email protected]'') OR (client_email_alt = ''[email protected]''))


En primer lugar, puede generar subconsulta, luego obtener la parte "DONDE" e insertarla en la consulta principal

$subquery = $db->select(); $subquery->orWhere(''a>10''); $subquery->orWhere(''b<20''); etc.. $subquery = $subquery->getPart(Zend_Db_Select::WHERE); $select->where(implode('' '',$subquery));


Necesitaba combinar sentencias AND / OR pero incluye sentencias OR condicionalmente, y solo las agregué en algunos casos. Esta solución es una adaptación de lo que hice, basada en pequeñas modificaciones de la respuesta aceptada.

$sql = $table->select() ->where(''company_id = ?'', $company_id); $orWhereClauses = []; // We could add a conditional statement to add this statement $orWhereClauses[] = $db->quoteInto(''client_email = ?'', $email1); // Same applies to this statement $orWhereClauses[] = $db->quoteInto(''client_email_alt = ?'', $email2); $sql->where(implode(" OR ", $orWhereClauses));



Para lograr esto, debe construir la cláusula agrupada dentro de una única llamada al método where .

Si ambos valores de condiciones son los mismos, puede hacer esto:

$select->where(''client_email = ? OR client_email_alt = ?'', $client_email)

Si hay múltiples marcadores de posición dentro de la cadena, el método quoteInto del adaptador de DB reemplazará todos los marcadores de posición con el valor proporcionado.

Si necesita agrupar un OR con diferentes valores para cada campo, debe citar los valores manualmente. Es un poco más complejo:

$select->where( $db->quoteInto(''client_email = ?'', $email1) . '' OR '' . $db->quoteInto(''client_email_alt = ?'', $email2) ); // $db is your instance of Zend_Db_Adapter_* // You can get it from a Zend_Db_Table_Abstract //subclass by calling its getAdapter() method


Puede usar getPart() para obtener la instrucción WHERE y luego conectar getPart() .

$select->where(''client_email = ?'', $client_email) ->orWhere(''client_email_alt = ?'', $client_email); $subquery = $select->getPart(Zend_Db_Select::WHERE); $select ->reset(Zend_Db_Select::WHERE); $select ->where(''company_id = ?'', $company_id) ->where(implode('' '',$subquery));