2009-07-24 3 views
33

Кто-нибудь знает способ группировки где clauses с Zend_Db? В принципе у меня есть этот запросГруппировка предложений WHERE с Zend_Db_Table_Abstract

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

Что дает мне это:

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

Но мне нужно, чтобы дать мне это, где сгруппировали оператор ИЛИ:

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

ответ

51

Для того, для этого вам нужно построить сгруппированное предложение в рамках одного вызова метода where.

Если оба значения условия одинаковы, вы можете сделать это:

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

Если имеется несколько заполнителей внутри строки, quoteInto метод БД адаптера заменит все заполнители с значением параметра.

Если вам нужно сгруппировать OR с разными значениями для каждого поля, вам нужно вручную указать значения. Это немного сложнее:

$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

именно то, что я искал, спасибо – Mark

+1

Что нам нужно $ select-> startWhereGroup() и $ select-> endWhereGroup(). –

+1

Zend Framework 2 \ Zend \ Db \ Sql \ Select выглядит перспективным в этом отношении. –

6

Вы можете использовать getPart() получить WHERE заявление, а затем подключить подзапросов.

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

Для Zend Framework версии 2, вещи немного отличаются:

См 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(); 

работает отлично и чувствует себя намного чище, чем методы ZF1.

0

В первом вы можете создать подзапрос, а затем получить «где» часть и вставить в основной запрос

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

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

мне нужно объединить И/ИЛИ заявления, но в том числе или заявления, условно, добавив их только в некоторых случаях. Это решение является адаптацией того, что я сделал, на основе небольших изменений принятого ответа.

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

 Смежные вопросы

  • Нет связанных вопросов^_^