Laravel : recherche à l'aide de plusieurs mots-clés dans plusieurs colonnes avec des résultats classés par pertinence
Dans Laravel, implémentation d'une fonction de recherche qui recherche des données en fonction de plusieurs mots-clés dans plusieurs colonnes peuvent être difficiles, surtout lorsque l'ordre de pertinence est impliqué. Ce guide complet aborde ce problème en détail, en fournissant une solution qui suit une approche structurée.
Structure de la base de données
La table de la base de données comporte deux colonnes : méta_name et méta_description, où les mots-clés de recherche correspondront.
Critères de recherche
Le la recherche a des critères spécifiques, priorisant les résultats en fonction de la présence de mots-clés dans les deux colonnes. Les lignes contenant les trois mots-clés ont la priorité la plus élevée, suivies par les lignes contenant uniquement les deux premiers mots-clés et enfin, les lignes contenant uniquement le premier mot-clé.
Pagination
Le les résultats de la recherche seront chargés dynamiquement à l'aide de la pagination, les nouveaux résultats étant ajoutés lorsque l'utilisateur fait défiler vers le bas de la page. page.
Code source
L'extrait de code suivant récupère les résultats de la recherche dans l'ordre souhaité :
<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>
Requête finale
Pour combiner les résultats, nous utilisons l'unionAll méthode :
<code class="php">$posts = $all->unionAll($twoWords)->unionAll($oneWord)->get(); // check this first # or $posts = $all->unionAll($twoWords)->unionAll($oneWord)->skip($start)->take($this->rowperpage)->get();</code>
Ce code récupère les résultats dans l'ordre spécifié, en donnant la priorité à la pertinence. Les méthodes skip() et take() sont utilisées pour la pagination, où $start représente le nombre de résultats déjà affichés. Enfin, la méthode get() récupère les enregistrements.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!