はじめに
実務でwhereとorWhereを併用してデータを取得しようとした時に、想定と違ったデータを取得してしまったことがあったので、whereとorWhereを併用する際に気を付けることを備忘録として残します。
シチュエーション
例として、Bクラスの「田中さん」か「佐藤さん」を取得したい状況とします。
実装コード(NG)
まずはNGの例からです。
User::where('class','=','B')
->where('name','=','田中')
->orWhere('name','=','佐藤')
->get();
まずクラスをBでソートしてから、田中さん or 佐藤さんを取得しようとしています。
しかしこの時、OR条件の「orWhere」よりもAND条件の「where」の方が先に来ているため、AND条件の「where」の方が優先されてしまいます。
そのため「Bクラスの田中さん」or「全クラスの中の佐藤さん」を取得することになってしまいます。
実装コード(OK)
User::where('name','=','田中')
->orWhere('name','=','佐藤')
->where('class','=','B')
->get();
OR条件の「orwhere」の方が先に来ているため、「Bクラスの田中さん」or 「Bクラスの佐藤さん」と目的のものを取得することができます。
最後に
順番が少し違うだけで取得できるものが全く異なってしまうので、これからクエリを書く際は充分に気を付けようと思います。