2009-07-24 11 views
33

Qualcuno sa di un modo per raggruppare le clausole con Zend_Db? Fondamentalmente ho questa queryRaggruppamento delle clausole 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); 

Il che mi sta dando questa:

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

Ma ho bisogno di darmi questo, in cui l'istruzione OR è raggruppato:

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

risposta

51

Al fine per ottenere ciò, è necessario costruire la clausola raggruppata all'interno di una singola chiamata al metodo where.

Se entrambi i valori delle condizioni sono le stesse, si può fare questo:

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

Se ci sono più i segnaposto all'interno della stringa, il metodo della scheda DB quoteInto sostituirà tutti i segnaposto con il valore fornito.

Se è necessario raggruppare un OR con valori diversi per ogni campo, è necessario citare manualmente i valori. E 'un po' più complessa:

$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

esattamente quello che stavo cercando, grazie – Mark

+1

Ciò di cui abbiamo bisogno è $ Seleziona-> startWhereGroup() e $ Seleziona-> endWhereGroup(). –

+1

Zend Framework 2 \ Zend \ Db \ Sql \ Select sembra promettente in questo senso. –

6

È possibile utilizzare getPart() per arrivare dove dichiarazione e quindi collegare sub-query.

$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

In primo luogo è possibile generare subquery, quindi ottenere "WHERE" parte e inserire nella query 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

avevo bisogno di combinare e/o consigli, ma tra cui istruzioni OR condizionale, aggiungendoli solo in alcuni casi. Questa soluzione è un adattamento di ciò che ho fatto, basato su piccole modifiche della risposta accettata.

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