見出し画像

Laravel学習記録 #032 Like検索を学ぶ

LaravelでLike検索について学習したものをまとめています。

Like検索について(Eloquent、クエリビルダ)

likeメソッドはないのでwhereメソッドにlikeを指定して使います。
通常のSQL同様「%」がワイルドカードです。

$results = Hoge::where('column', 'like', '%keyword%')->get();

検索するキーワードにワイルドカード「%」「_」が含まれる場合を考慮するとエスケープが必要ですね。あと「\」も考慮します。

$keyword = 'keyword_%\\';
$escapedKeyword = str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $keyword);

もしくは

$escapedKeyword = addcslashes($keyword, '%_\\');


生成されるSQLを見てみる

str_replaceパターン

$keyword = 'keyword_%\\';
$escapedKeyword = str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $keyword);

$query = Keyword::where('keyword', 'like', '%' . $escapedKeyword .'%');
dd($query->toSql(), $query->getBindings());

結果

select * from `keywords` where `keyword` like ?

// キーワード
%keyword\_\%\\%


addcslashesパターン

$keyword = 'keyword_%\\';
$escapedKeyword = addcslashes($keyword, '%_\\');

$query = Keyword::where('keyword', 'like', '%' . $escapedKeyword .'%');
dd($query->toSql(), $query->getBindings());

結果

select * from `keywords` where `keyword` like ?

// キーワード
%keyword\_\%\\%

同じ結果になりますね。
バックスラッシュでも同じ結果になります。

この記事が気に入ったらサポートをしてみませんか?