2009-07-24 7 views
33

誰かがZend_Dbでwhere節をグループ化する方法を知っていますか?基本的に私はこのクエリZend_Db_Table_AbstractでWHERE節をグループ化する

$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]')) 

答えて

51

ために:ORステートメントがグループ化されている

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

しかし、私はそれが私にこれを与える必要があり、これを実現するには、whereメソッドを1回呼び出してgrouped句を作成する必要があります。

条件の両方の値が同じであれば、あなたがこれを行うことができます:

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

文字列内に複数のプレースホルダがある場合は、DBアダプタの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

あなたはWHERE文を取得するためにgetPart()を使用して、サブクエリを接続することができます。 Zend Frameworkのバージョン2のために

$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

、物事は少し異なります

は正常に動作してZF1の方法よりもはるかにクリーンな感じ

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(); 
を参照してください。まずあなたは私が結合するために必要なAND/ORステートメントだけいくつかのケースでそれらを追加し、条件付きを含めORステートメント「WHERE」の部分を取得、その後、サブクエリを生成し、メインクエリに

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

を挿入することができて