36

Zend_Db で 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@address.com') OR (client_email_alt = 'email@address.com')

しかし、OR ステートメントがグループ化されている場合は、次のようにする必要があります。

SELECT `clients`.* FROM `clients` WHERE (company_id = '1') AND ((client_email = 'email@address.com') OR (client_email_alt = 'email@address.com'))
4

5 に答える 5

57

これを実現するには、whereメソッドへの単一の呼び出し内でグループ化された句を作成する必要があります。

条件の両方の値が同じ場合は、次のようにすることができます。

$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 
于 2009-07-24T18:39:24.390 に答える
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));
于 2013-02-08T09:38:52.183 に答える
1

AND/OR ステートメントを組み合わせる必要がありましたが、条件付きで OR ステートメントを含め、場合によってのみ追加しました。この解決策は、受け入れられた回答の小さな変更に基づいて、私が行ったことを適応させたものです。

$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));
于 2016-04-26T13:34:13.103 に答える
0

最初にサブクエリを生成し、次に「WHERE」部分を取得してメインクエリに挿入できます

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

$subquery = $subquery->getPart(Zend_Db_Select::WHERE);
$select->where(implode(' ',$subquery));
于 2015-02-20T14:11:51.037 に答える