Laravel 10.47.0 で追加された whereAll と whereAny が便利すぎる

アプリケーションを作成していると、「【名前】か【ふりがな】に○○を含む」みたいな処理を書くことって、けっこう多いと思います。あるいは「【購入商品1】または【購入商品2】または【購入商品3】のどれかに商品ID○を含む」とか(後者はデータベース設計的にどうかと思いますが、購入商品の数の上限が決まっているような場合には、まぁよくある話ですよね)。

このような処理は従来であれば

$clients = DB::table('clients')
    ->where(function ($query) use ($validated) {
        $query->where('name', 'like', '%' . $validated['name']. '%')
              ->orWhere('ruby', 'like', '%' . $validated['name'] . '%');
    })->get();

みたいに書くしかなかったのですが、他の条件と混じらないようにするためにクロージャにする必要があったりと、けっこう面倒でした。これが、whereAny メソッドの追加によって、以下のように書けるようになりました。

$clients = DB::table('clients')
    ->whereAny([
        'name',
        'ruby'
    ], 'like', '%' . $validated['name']. '%')
    ->get();

どちらの書き方でも、生成される SQL は以下のようになります($validate['name’] に テスト が入っていたとき)。

SELECT *
FROM cilents
WHERE (
    name LIKE '%テスト%' OR
    ruby LIKE '%テスト%'
)

whereAll メソッドは、配列で指定した全てのカラムに同じ値が入っているものを抽出することができます。こちらはあまり使う機会がないかもしれませんが、Laravel のドキュメントにあるように、「タイトルと本文の両方に指定した文字を含む」みたいな場合に使うことができます。

10.47.0 が公開されたのが2024年3月6日だったようなのですが、マイナーバージョンのアップデートでこんな機能が追加されることもあるんですね。。

この記事を書いた人
グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。

PHPLaravel