読み込みが終了しない場合は、しばらく待つか、リロードを行なってください。
If loading does not finish, wait for a while or reload.
エンジニア向けの情報を発信するブログです。
どなたでも発信できます。
お好きに利用していただれば幸いです。
こんにちは!
複数フィールドで検索機能を実装する機会がありましたので紹介しようと思います!
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ブランチにプッシュしていますので、合わせて参考にしてみてください!