Laravelでフリーワード検索機能を実装する方法(Laravel10.47で追加されたwhereAnyメソッドを使う方法とそれ以前の方法を解説)

目次

スポンサードリンク

Webアプリを作る際にフリーワード検索機能を実装する機会は多いです。例えば、会員情報を一覧表示する画面にフリーワード検索機能を追加するとしましょう。

検索条件を入力するテキストボックスを一つ用意して、入力した条件に該当する会員を表示する画面を想像してみてください。 テキストボックスは一つなので、会員の氏名やID、メールアドレスなど会員の情報の内、何を入力しても構いません。いずれかの項目にマッチした会員を抽出するような機能をフリーワード検索機能としましょう。

Laravel10.46 以前のクエリ実装方法

従来、Laravel でフリーワード検索機能を実装する際は、下記のようにクエリを作成する必要がありました。ポイントは、whereメソッドにクロージャで条件を渡している箇所です。

下記コードは、Userモデルに含まれるIDや氏名、ふりがな、メールアドレスを対象に検索をかけます。検索対象の項目が増える場合は、orWhereに続く部分を1行増やす必要がありました。よく見かけるコードですが、クロージャを使う部分などの記述は初めて見ると分かりにくいかもしれません。

    $query = User::select('*')->where('active', true);
    if ($freeword) {
        $query->where(function($query) use ($freeword) {
            $query->where('user_id', 'LIKE', '%' . $freeword . '%')
                ->orWhere('last_name', 'LIKE', '%' . $freeword . '%') // 姓
                ->orWhere('first_name', 'LIKE', '%' . $freeword . '%') // 名
                ->orWhere('last_name_kana', 'LIKE', '%' . $freeword . '%') // ふりがな(姓)
                ->orWhere('first_name_kana', 'LIKE', '%' . $freeword . '%') // ふりがな(名)
                ->orWhere('email', 'LIKE', '%' . $freeword . '%');
        });
    }
    $users = $query->get();

Laravel10.47 以降のクエリ実装方法(whereAny)

Laravel10.47で追加されたwhereAnyメソッドを使うとクロージャを使わずにシンプルにコードを記述することができます。下記はサンプルコードです。

$users = DB::table('users')
    ->where('active', true)
    ->whereAny([
        'user_id',
        'last_name',
        'first_name',
        'last_name_kana',
        'first_name_kana',
        'email',
    ], 'LIKE',  '%' . $freeword . '%')
    ->get();

このクエリの結果は以下のようなSQLに変換されて実行されます。freewordの部分はユーザーがテキストボックスに入力した検索文字列に置き換わります。

SELECT *
FROM users
WHERE active = true AND (
    user_id LIKE '%freeword%' OR
    last_name LIKE '%freeword%' OR
    first_name LIKE '%freeword%' OR
    last_name_kana LIKE '%freeword%' OR
    first_name_kana LIKE '%freeword%' OR
    email LIKE '%freeword%'
)

括弧で囲まれたフリーワード検索部分のクエリは各条件が OR で指定されています。この部分を AND にして検索項目すべてにフリーワードが入っているデータを抽出したい場合は、whereAny ではなく、whereAll メソッドが使えます。あまり使用する機会は無いかもしれないですが覚えておきましょう。

まとめ

ソースコードは少しでもシンプルに見通し良くしておきたいですよね。特にSQLのクエリ部分は仕様が複雑化しやすく、ソースコードも複雑になりがちです。是非覚えておきたい書き方ですね。

PHP、Laravelを学ぶ際のおすすめ書籍

プロフェッショナルWebプログラミング Laravel
Docker Desktop + Laravel Sail を使った環境構築に始まり、Twitter風アプリを題材に基本的なアプリケーション構築の流れを学べます。メール送信やログイン、バッチ処理など実践的な内容もかかれてたので最初の一歩にはおすすめです。


レベルアップPHP ~言語を理解して中級者へ~
PHPの入門書を読み終えさらなる実力をつけたいエンジニア向けの技術書です。PHPの入門書にはあまり載っていないバージョンアップ方法やパフォーマンスなど、実務に役立つ内容も記載が豊富。30日間の無料体験もできる『Kindle Unlimited』でも読めます。

独習PHP 第4版
PHP の基本から抑えたいときはこちら。解説が詳しい、練習問題で知識の定着も促せる。辞書のような一冊。手元にある安心感。とにかく分厚い。



スポンサードリンク

関連リンク

公式ドキュメント
https://laravel.com/docs/10.x/queries#where-any-all-clauses

Laravel News(Laravel公式ブログ)
https://laravel-news.com/laravel-10-47-0