where句に限ったことではないが、クエリビルダでSQLを組み立てている時、条件によってwhere句がいるケース、いらないケースということがよくある。
例えば
$flgがNULLの場合、全てのレコードを取得したい場合
$users = User::orderBy('id', 'ASC')
->get();
$flgがNULL以外の場合、flgカラム=$flgのレコードを取得したい場合
$users = User::orderBy('id', 'ASC')
->where('flg', $flg)
->get();
if文で$flgを判定して、上記2つをifとelseに分けてもいいけど、1つにまとめる方法
$users = User::orderBy('id', 'ASC')
->when(!is_null($flg), function($q) use ($flg){
$q->where('flg', $flg);
})
->get();
whenメソッドを使う。
第一パラメータがTrueの場合、第二パラメータのクロージャを実行する。
クロージャにはuseでパラメータを渡すことが出来る。
こっちのコードの方がシンプルだと思う。