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 Zend Framework versión 2, las cosas difieren un poco:
Consulte http://framework.zend.com/apidoc/2.2/classes/Zend.Db.Sql.Predicate.Predicate.html#nest
$table->select()
->where([''company_id''=> $company_id])
->nest
->where(''client_email = ?'', $client_email)
->or
->where(''client_email_alt = ?'', $client_email)
->unnest();
funciona bien y se siente mucho más limpio que los métodos ZF1.
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));