Implist | 駆け出し後エンジニアのための理論と実装

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


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

やりたいこと

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

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

sql
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使うようにしましょう。