Laravel:使用基於相關性的排序對多列搜尋多個關鍵字
在Laravel 中,實作針對多列考慮多個關鍵字的搜尋同時保持相關性可能具有挑戰性。本文解決了這樣的問題,即搜尋結果根據關鍵字在指定列中出現的頻率進行排序。
場景:
搜尋欄需要三個關鍵字作為輸入,搜尋條件為:
資料庫查詢:
為了達到預期的結果,資料庫查詢應該組合多個OR 條件,並利用whereNotIn 函數排除先前條件中已取得的行。
<code class="php">$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'));</code>
並集和排序:
最後使用 union 函數將 $all、$twoWords 和 $oneWord 結果合併,得到有序的搜尋結果。
<code class="php">$posts = $all->union($twoWords)->union($oneWord)->get(); // check this first # or $posts = $all->union($twoWords)->union($oneWord)->skip($start)->take($this->rowperpage)->get();</code>
這樣可以保證搜尋結果是有序的根據指定的條件,從包含指定列中所有三個關鍵字的行開始。
以上是如何在 Laravel 中使用基於相關性的排序跨多個列搜尋多個關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!