Laravel Eloquentの「where like」で「前方・後方・部分一致」検索する

シェアしてね〜🤞

LaravelのEloquentでwhere like検索が実行できます。

ニュース: Laravel9がリリースされました。Dockerを使ったLaravel9の環境構築方法をまとめたので、興味ある方は覗いてください。

やりたいこと

以下のようなusersテーブルがあるとします。
このusersテーブルのemailカラムに対してlikeで検索をかけたいとします。

LaravelのEloquentを使ってどのように記述するか見ていきます。

CREATE TABLE `users` (  
 `id` bigint unsigned NOT NULL AUTO_INCREMENT,  
 `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,  
 `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,  
 `email_verified_at` timestamp NULL DEFAULT NULL,  
 `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,  
 `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,  
 `created_at` timestamp NULL DEFAULT NULL,  
 `updated_at` timestamp NULL DEFAULT NULL,  
 PRIMARY KEY (`id`),  
 UNIQUE KEY `users_email_unique` (`email`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

ダミーデータはseed+factoryを使って1,000件ほど生成しました。

Eloquent where likeで前方一致

Eloquentではlikeメソッドなどは用意されていないため、where句の中にLIKEと直書きします。

$users = User::where("name", "LIKE", "Bob%");  
dd($users->get());

以下のように取得できました。

LIKEを使うときはタイプセーフにかけないので、スペルミスなどを注意する必要がります。

Eloquent where likeで後方一致

%の位置を変えてあげるだけで良いです。

$users = User::where("name", "LIKE", "Bob%");
dd($users->get());

Eloquent where likeで部分一致

こちらも同様です。

$users = User::where("name", "LIKE", "%Bob%");  
dd($users->get());

最後に、
実行実態はSQLを発行しているだけなので、例えばemailにindexがついている場合、それが効くのは前方一致の場合のみです。
実行されるクエリはtoSQL()などで確認できるので、実行計画を見ながらEloquent使うようにしましょう。

シェアしてね〜🤞