Laravel – ANDとORの優先順位

概要

where()orWhere()組み合わせることで、WHERE句のANDORを表現できる。ここではこれらのメソッドの書き方と生成されるSQL、条件の組み合わせの優先順位を整理する。

以下のようなメソッドの書き方が可能になる。

  • 条件1 OR 条件2 AND 条件3ANDが優先される書き方
  • (条件1 OR 条件2) AND 条件3で括弧内のORが優先される書き方

where()orWhere()については、クエリービルダーのメソッドを参照。

準備

クエリービルダーで使った以下の3つのテーブルで各メソッドを確認する。

これをordersに対してcustomersemailsを左結合で関連付けて並べると以下のとおり。

チェーンの展開とANDの優先

where()orWhere()をチェーンで連ねた場合、それぞれの条件が単純にANDあるいはORで連ねられる。その結果ANDが処理された後ORが処理される。

  • ...->where(条件)'... AND 条件'
  • ...->orWhere(条件)'... OR 条件'

以下の例では、where()->orWhere()->where()とメソッドチェーンを組んでいる。

上記のクエリービルダーで生成されるSQLは以下のとおり。

この結果AND演算が優先され、「item='wire'または、item='rubber sheet'かつid=1」という条件で2つのデータが抽出される。

  • 4: 2020-06-07 00:00:00
    • customer name: customer1
    • email address: customer1@mail.com
    • ordered item : rubber sheet
  • 5: 2020-06-08 00:00:00
    • customer name: customer3
    • email address:
    • ordered item : wire

 

クロージャによる()の表現

ANDに対してORの条件を優先させたい場合、SQLでは括弧で括る。クエリービルダーでは、括弧で括りたい処理をクロージャ―でまとめる。

where(function($query) { 括弧でまとめたい処理群; })

以下の例では、上の例と順番は同じだが、最初のwhere()orWhere()をクロージャ―でまとめている。

この結果、まず最初の2項のOR演算が処理され、その結果と残りの条件のAND演算で抽出処理される。生成されるSQLは以下のとおりでOR演算が括弧で括られている。

実行結果は以下のとおりで、「item='wire'またはitem='rubber sheet'」で3つのデータが抽出され、その結果とid=1ANDで結果が一つに絞り込まれる。

  • 4: 2020-06-07 00:00:00
    • customer name: customer1
    • email address: customer1@mail.com
    • ordered item : rubber sheet

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です