LaravelのEloquentを使ってクエリを書いていると、時々特定の条件下の時のみ追加されるクエリを書きたくなることがありますね!(ない人はごめん)
例えば、特定のパラメータが渡ってきたときだけに特定のカラムに対するwhereの条件を追加したい... のようなときにif文を使って無理矢理繋げたりすると見通しが悪くなってあまりいい感じには見えないのでそれを解決する方法を紹介したいと思います。
whenを使ってみる
use Illuminate\Database\Eloquent\Builder;
// $categoryIdがnullじゃないときだけcategory_idで絞り込みたい時
$posts = Post::query()
->where('is_public', '=', true)
->when(
$categoryId !== null,
fn(Builder $query) => $query->where('category_id', '=', $categoryId)
)
->get();
whenを使うことで圧倒的にシンプルで見やすくなりましたね! これでif文と訳のわからない変数の書き換えの地獄から開放されるようになります。
また、コツとしては渡してあげる無名関数にはちゃんと引数にBuilderの型を付けることで、IDEの補完もエラー検出も効くようになるので忘れずに付けておきましょう!
さいごに
このwhenくんはIlluminate\Support\Traits\Conditionable
というtraitから生えていて、多くのLaravelのクラスはこれを実装しているのでEloquentのみならず使える箇所が多くあります。
是非活用してみてください!