2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel+Eloquentで特定の条件を満たす時だけ追加するクエリの条件をwhenを使って綺麗に書いてみる

Posted at

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のみならず使える箇所が多くあります。

是非活用してみてください!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?