BeginnerEngineerBlog
中の人
中の人

[laravel クエリビルダー CONCAT] 複数ワードで複数カラムのlike検索

公開: 2021-09-07 22:00
更新: 2021-12-11 12:44
5340
laravel like検索 曖昧検索 クエリビルダー CONCAT
laravelのクエリビルダーで複数のキーワードと複数のフィールドでlike検索する方法を紹介します!ここで紹介する内容は、いずれかもしくは全てのフィールドでキーワードを満たせばヒットという仕様の紹介になります!


こんにちは!


複数フィールドで検索機能を実装する機会がありましたので紹介しようと思います!


laravelのバージョン: 6.x


例えば、以下のようなarticlesテーブルがあったとします。




検索対象のフィールドはtitleとcontentの二つとします。


検索方法は、キーワードを複数送信して、対象のフィールドどちらかもしくは両方でキーワードを満たせばヒットという仕様にしたいとします。


キーワード

['あいまい', 'like']


で検索した場合、



こんな感じでデータを取得したいということです!


ということで、以下が実装方法です!


📁 app/Http/Controllers/ArticleController.php

//省略
use App\Article;
use Illuminate\Support\Facades\DB;
//省略

public function search(Request $request)
{
    $word = $request->get('word');//送信されたキーワードをゲット
    $query = Article::query();//Articleモデルのクエリビルダを開始
    if (isset($word)) {
        $array_words = preg_split('/\s+/ui', $word, -1, PREG_SPLIT_NO_EMPTY);//スペース区切りでキーワードを配列に変換
        foreach ($array_words as $w) {
            $escape_word = addcslashes($w, '\\_%');//エスケープ処理
            $query = $query->where(DB::raw("CONCAT(title, ' ', content)"), 'like', '%' . $escape_word . '%');//like検索
        }
    }
    $articles = $query->get();//クエリビルダーの結果をゲット($wordがない場合全て取得)
    return view(
        'article.list',
        [
            'articles' => $articles
        ]
    );
}


CONCATはフィールドを結合して、データを連結してくれます。


例えば、上のデータベースのデータで、id33の場合、CONCATでtitleとcontentを連結すると


あいまい検索複数のフィールドでlike検索をします。
like検索とは、あいまい検索ともいいます


となります(改行についても多分反映されていると思う)


なので、このままだと、例えば


検索複数


というキーワードで検索すると、title、content単体で考えると、存在しないキーワードなのですが、ヒットしてしまいます。


なので、


DB::raw("CONCAT(title, ' ', content)")


と、間に半角スペースを入れることで、


あいまい検索 複数のフィールドでlike検索をします。
like検索とは、あいまい検索ともいいます


とtitleの部分とcontentの部分の間に半角スペースが入り、結果としてフィールド単体として検索することが可能になります。

これで、どちらかもしくは両方でキーワードを満たせばヒットという仕様を満たすことができます!


ということでこんな感じの検索を実装したい方は参考にしてみてください!


ちなみにこのソースコードは、Tutorial:CONCATブランチにプッシュしていますので、合わせて参考にしてみてください!



0
0
0
0
通信エラーが発生しました。
似たような記事