Laravel で順序付けされた関連性を備えた複数の列に対する複数のキーワードの検索
複数のデータベース列に対する複数のキーワードを含む検索機能の実装は、特に困難な場合があります。関連性に基づいて結果を並べ替える必要がある場合。 Laravel では、これに取り組むためのアプローチがいくつかあります。
データベース クエリを使用したアプローチ
この問題に対処する 1 つの方法は、複数のデータベース クエリを構築して、以下に基づいて結果を取得することです。具体的な基準。考えられる実装は次のとおりです。
$word1 = 'word1'; $word2 = 'word2'; $word3 = 'word3'; $all = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->where('meta_name', 'like', "%{$word2}%") ->where('meta_name', 'like', "%{$word3}%") ->orWhere(function($query) use ($word1, $word2, $word3) { $query->where('meta_description', 'like', "%{$word1}%") ->where('meta_description', 'like', "%{$word2}%") ->where('meta_description', 'like', "%{$word3}%"); }); $twoWords = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->where('meta_name', 'like', "%{$word2}%") ->orWhere(function($query) use ($word1, $word2) { $query->where('meta_description', 'like', "%{$word1}%") ->where('meta_description', 'like', "%{$word2}%"); }) ->whereNotIn('id', $all->pluck('id')); $oneWord = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->orWhere('meta_description', 'like', "%{$word1}%") ->whereNotIn('id', $all->pluck('id')) ->whereNotIn('id', $twoWords->pluck('id')); $posts = $all->union($twoWords)->union($oneWord)->get();
このアプローチでは、3 つのキーワードすべての存在、最初の 2 つのキーワードのみ、次に最初のキーワードのみの存在に基づいて結果をフィルタリングします。最後に、union 演算子を使用して結果を結合します。
ページネーションに関する追加の考慮事項
スクロール時ロード機能を実装するには、JavaScript および AJAX リクエストを組み込むことができます。ユーザーがページの一番下までスクロールすると、AJAX リクエストを送信して、次の結果セットを取得できます。クエリ ビルダーの Skip() メソッドと take() メソッドを使用して、取得するレコードのオフセットと制限を指定できます。
// Retrieve the specified number of results after the last loaded result $start = $request->get('start');//how many results have already been shown $records = Post::select('*') ->skip($start) ->take($this->rowperpage) // $this->rowperpage= 4 e.g. ->get();
スクロールできる結果がもうない場合の処理を忘れないでください。
以上がLaravelで複数の列にわたる順序付けされた関連性検索を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。