2

重複の可能性:
Zend Framework の複雑な Where ステートメント

クォートを使用しながら、このようなものを Zend_Db_Select に追加するにはどうすればよいですか?

SELECT x FROM y WHERE (a=1 OR b=2) AND (c=3 OR d=4)

where() と orWhere() を見たことがありますが、括弧でグループ化する方法がわかりません。私はこれを書くことができることに気づきました:

->where('(a=1 OR b=2) AND (c=3 OR d=4)')

しかし、理想的には、引用に2番目のパラメーターを使用できるように、where()を4回個別に呼び出したいと思います(値1、2、3などがユーザー生成の入力であると仮定します)。

純粋な流暢なスタイルでこれを行う方法はありますか?

4

1 に答える 1

4

純粋な流暢なスタイルでこれを行う方法はありますか?

簡単な答え:いいえ。

あなたが言及するように、あなたはorWhereのような条件を書くために使うことができます(a = ?) OR (b = ?)

Zend_Db_Selectは、where()またはorWhere()メソッドを使用して指定した各式を自動的に括弧で囲みます。これは、ブール演算子の優先順位が予期しない結果を引き起こさないようにするのに役立ちます。

ただし、希望どおりにネストANDOR条件を設定することはできません。

あなたがこれを書いた場合:

->where('a=?', $a)
->orWhere('b=?', $b)
->where('c=?', $c)
->orWhere('d=?', $d)

これにより、SQLは次のようになります。

(a=1) OR (b=2) AND (c=3) OR (d=4)

これは次のように解釈されます(あなたが望むものではありません):

(a=1) OR ((b=2) AND (c=3)) OR (d=4)

代替案:

  • SQLを手動で記述します。
  • ここquoteIntoに示されているように使用します。
于 2012-08-14T21:39:52.820 に答える