"when"を用いて簡単に見やすい検索機能を実装しよう(Laravel )

1 min read読了の目安(約1300字

今回はLaravelで検索機能を実装する方法を解説します。

普通にif文でリクエストがあるかどうかチェックして、whereで条件をつけるのでも全然問題ありませんが、実はLaravelのQuery Builderで値があればクエリを付与するという便利なメソッドがあるので,今回はそちらの紹介をしたいと思います。

usersテーブルがあると仮定して、「ユーザー名の部分一致検索」、「部署ID検索」の2つを実装してみましょう!

先に完成形を確認する

public function index(Request $request)
{
    $name = $request->input("name");
    $departmentId = $request->input("departmentId");
    
    $query = User::query();
    
    // 名前で検索する
    $query->when($name, function($query, $name) { 
        return $query->where('name', "LIKE", "%$name%"); 
    });
    
    // 部署IDで検索する
    $query->when($departmentId, function($query, $departmentId) { 
        return $query->where("department_id", $departmentId); 
    });
    
    return $query->get();
    
}

when メソッドとは?

whenメソッドは第2引数にクエリを発行するコールバック関数を書き、第1引数には第2引数のコールバック関数を実行するかどうかを指定します。

つまり、第一引数がtrueであれば、第2引数でクエリを発行しますよっていうメソッドです。

上記で先に見せているようにこのように使うことができます。
この場合は変数nameが存在すれば、nameでLIKE検索をかけます。

$query->when($name, function($query, $name) { 
    return $query->where('name', "LIKE", "%$name%"); 
});

普通にifを使う場合だとこうなります。

if ($name) {
    $query->where('name', "LIKE", "%$name%"); 
}

どっちも同じことなので、こういう方法もありますよということを頭の片隅において、好きな方を使っていただければと思います!

おわりに

今回は QueryBuilderのwhenメソッドの紹介をしました。

検索機能を作る場面は結構あると思うので、ぜひこの機会に使ってみてくださいね。

では、また!