SQLを使わずに、laravelのクエリビルダーでOR演算子が途中で入る場合の()で優先順位を上げる方法を調べてみた。
クエリービルダーでは、何も指定しないとAND演算子で接続される
WHERE A=1 AND B=2 AND C=3
1 2 3 4 |
$query = User::query(); $query->where('A',1); $query->where('B',2); $query->where('C',3); |
OR演算子の指定も出来る
WHERE A=1 AND B=2 OR C=3
1 2 3 |
$query->where('A',1); $query->where('B',2); $query->orwhere('C',3); |
ただし、AND演算子の方が強いので、処理の優先順位はこうなる
WHERE (A=1 AND B=2) OR C=3
OR演算子を優先したい場合には、通常のSQLでは()で囲んで指定する
A=1 AND (B=2 OR C=3) ←この条件で検索したい!
こうすれば出来るかと思ったけどダメ~。
1 2 |
$query->where('A',1); $query->where('B',2)->orwhere('C',3); |
あきらめて、素直に英語ドキュメントを探したら、あっさりと見つかった。
無名関数を使って記述するのね…。SQLオンリーの方が楽な気もする(^_^;)
https://laravel.com/docs/5.1/queries#advanced-where-clauses
これが正解
A=1 AND (B=2 OR C=3)
1 2 3 4 5 6 |
$query->where('A',1); // クロージャー内で呼び出し元の関数を使いたい時は、use文を使う $query->where(function ($query) use ($outer_variable) { $query->where('B',2) ->orwhere('C', $outer_variable); }); |
日本語で調べても分からない時には、素直に英語で調べるのが早道だな・・・。