ホームページ >データベース >mysql チュートリアル >Laravelで複数の列にわたる順序付けされた関連性検索を実装するにはどうすればよいですか?

Laravelで複数の列にわたる順序付けされた関連性検索を実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 18:26:02816ブラウズ

How to Implement Ordered Relevance Search Across Multiple Columns in Laravel?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。