Laravel7 クエリビルダで条件によって句を追加したい時の書き方

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でパラメータを渡すことが出来る。

こっちのコードの方がシンプルだと思う。

返信を残す

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