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使うようにしましょう。
シェアしてね〜🤞