2009-07-24 3 views
33

Kennt jemand eine Möglichkeit, Where-Klauseln mit Zend_Db zu gruppieren? Im Prinzip habe ich diese AbfrageGruppierung von WHERE-Klauseln mit Zend_Db_Table_Abstract

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

Welche gibt mir dies:

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

Aber ich brauche es mir, dies zu geben, wo die OR-Anweisung gruppiert:

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

Antwort

51

Um Um dies zu erreichen, müssen Sie die gruppierte Klausel in einem einzigen Aufruf der Methode where konstruieren.

Wenn beide Werte von Bedingungen die gleichen sind, können Sie dies tun:

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

Wenn mehrere Platzhalter innerhalb des Strings sind, die quoteInto Methode des DB-Adapter werden alle Platzhalter mit dem bereitgestellten Wert ersetzen.

Wenn Sie eine OR mit verschiedenen Werten für jedes Feld gruppieren müssen, müssen Sie die Werte manuell angeben. Es ist ein bisschen komplizierter:

$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

genau das, was ich suchte, danke – Mark

+1

Was wir brauchen, ist $ select-> startWhereGroup() und wählen- $> endWhereGroup(). –

+1

Das Zend Framework 2 \ Zend \ Db \ Sql \ Select sieht in dieser Hinsicht vielversprechend aus. –

6

Sie getPart() verwenden können WHERE-Anweisung zu bekommen und dann Unterabfragen zu verbinden.

$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 ersten Sie Unterabfrage erzeugen kann, dann bekommen „WHERE“ Teil und legen Sie in den Haupt Abfrage

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

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

I erforderlich und/oder Aussagen zu kombinieren, aber einschließlich OR Aussagen bedingt, so dass sie nur in einigen Fällen das Hinzufügen. Diese Lösung ist eine Anpassung dessen, was ich getan habe, basierend auf kleinen Modifikationen der akzeptierten Antwort.

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