2009-07-24 13 views
33

¿Alguien sabe de una forma de agrupar cláusulas where con Zend_Db? Básicamente tengo esta consultaAgrupando cláusulas WHERE con Zend_Db_Table_Abstract

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

que me está dando esta:

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

Pero necesito que me dé este, donde se agrupa la instrucción OR:

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

Respuesta

51

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

Si ambos valores de condiciones son las mismas, se puede hacer esto:

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

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

Si necesita agrupar un OR con valores diferentes 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 
+0

exactamente lo que estaba buscando, gracias – Mark

+1

Lo que necesitamos es $ Seleccionar-> startWhereGroup() y $ Seleccionar-> endWhereGroup(). –

+1

El Zend Framework 2 \ Zend \ Db \ Sql \ Select parece prometedor en este sentido. –

6

Se puede utilizar para llegar a donde getPart() declaración y luego conectar sub-consultas.

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

En primer lugar se puede generar sub consulta, a continuación, obtener "WHERE" parte y se insertan en 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)); 
0

que necesitaba para combinar y/o frases, pero incluyendo o declaraciones en forma condicional, la adición de ellos sólo 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)); 
Cuestiones relacionadas