2009-07-24 11 views
33

Est-ce que quelqu'un connaît un moyen de grouper des clauses where avec Zend_Db? Fondamentalement, j'ai cette requêteGrouper les clauses WHERE avec Zend_Db_Table_Abstract

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

Ce qui me donne ceci:

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

Mais je en ai besoin pour me donner cela, où l'instruction OR est groupée:

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

Répondre

51

Pour pour ce faire, vous devez construire la clause groupée dans un seul appel à la méthode where.

Si les deux valeurs de conditions sont les mêmes, vous pouvez le faire:

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

Si plusieurs caractères génériques dans la chaîne, la méthode de l'adaptateur DB quoteInto remplacera tous les espaces réservés à la valeur fournie.

Si vous devez regrouper OR avec des valeurs différentes pour chaque champ, vous devez en indiquer manuellement les valeurs. Il est un peu plus complexe:

$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

exactement ce que je cherchais, merci – Mark

+1

Ce que nous avons besoin est sélectionner- $> startWhereGroup() et sélectionner- $> endWhereGroup(). –

+1

Le Zend Framework 2 \ Zend \ Db \ Sql \ Select semble prometteur à cet égard. –

6

Vous pouvez utiliser getPart() pour obtenir instruction WHERE puis connectez les sous-requêtes.

$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 premier, vous pouvez générer une sous-requête, puis obtenir le « OU » partie et l'insérer dans la requête principale

$subquery = $db->select(); 
$subquery->orWhere('a>10'); 
$subquery->orWhere('b<20'); 
etc.. 

$subquery = $subquery->getPart(Zend_Db_Select::WHERE); 
$select->where(implode(' ',$subquery)); 
0

je avais besoin de combiner ET/OU déclarations, mais incluant ou déclarations sous condition, en les ajoutant que dans certains cas. Cette solution est une adaptation de ce que j'ai fait, basée sur de petites modifications de la réponse acceptée.

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