目的
- クエリビルダでor条件をグループ化する方法をまとめる。
概要
- usersテーブルにflagカラムがあったとする。
- flagカラムにはintの0、intの1、nullいずれか格納されている。
- where句を用いてflagカラムが1もしくはnullのレコードを取得したい。
- 一見
where('flag', '!=', 0)
とすれば良さそうだが、nullはwhereでは判定できない。 -
orWhereNull('flag')
とwhere('flag', '=', 1)
を用いれば良さそうだが、いずれこちらのクエリビルダが複雑になった時にorWhereNull('flag')
があると絞り込み条件が「その他のwhere条件、もしくはflagカラムがnullのもの」となり、意図しない値が返される可能性がある。
方法
-
下記のように記載することで問題は解決する。(と思う。)
$users = DB::table('users') ->where(function($query) { $query->where('flag', 1) ->orWhereNull('flag'); }) ->get();
参考文献
- https://readouble.com/laravel/8.x/ja/queries.html(OR WHERE句 部分)