検索機能を作る時によくこう書いていた。
$query = User::select();
if(!empty($request->input('name'))){
$query->where('name',$request->input('name'));
}
$users = $query->get();
条件が増えるたびにif文が増えていきif文パラダイスが起きる。
そして最近知る事になるWhen、彼はif文パラダイスを解決してくれました。
$users = User::when($request->input('name'), function ($query) use ($request) {
return $query->where('name',$request->input('name'));
})->get();
if文を書かずに一本で書けます。
因みに第三引数にクロージャを書く事でelseの場合の処理も書けます
$users = User::when($request->input('name'), function ($query) use ($request) {
return $query->where('name',$request->input('name'));
}, function ($query) {
return $query->orderBy('created_at','desc');
})->get();
バージョンが5ぐらいの時からあるらしいんですが知りませんでした。
追記
php7.4以降はクロージャ省略して書いた方が見やすいです。
User::when($request->input('name'),
fn($query) => $query->where('name',$request->input('name'),
fn($query) => $query->orderBy('created_at','desc'))
追記2
コメントで指摘して頂きました。
if文の段階で代入した方が見やすいです。
if($name = $request->input('name')){
$query->where('name', $name);
}