19
4

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】 俺が書く検索機能のif文パラダイスはなんだったのか

Last updated at Posted at 2022-02-16

検索機能を作る時によくこう書いていた。

$query = User::select();
if(!empty($request->input('name'))){
  $query->where('name',$request->input('name'));
}
$users = $query->get();

条件が増えるたびにif文が増えていきif文パラダイスが起きる。
そして最近知る事になるWhen、彼はif文パラダイスを解決してくれました。

公式ドキュメント

image.png

$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);
}
19
4
3

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
19
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?