Ce package facilite la recherche structurée à partir de diverses sources. Voici un exemple où nous recherchons parmi certains modèles. Nous avons déjà fait quelques petites préparations sur les modèles eux-mêmes.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
La recherche sera effectuée sans tenir compte de la casse. $searchResults
contient désormais tous les modèles User
qui contiennent john
dans l'attribut name
et les BlogPost
qui contiennent 'john' dans l'attribut title
.
Selon vous, vous pouvez désormais parcourir les résultats de la recherche :
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
Dans cet exemple, nous avons utilisé des modèles, mais vous pouvez facilement ajouter un aspect de recherche pour une API externe, une liste de fichiers ou un tableau de valeurs.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
composer require spatie/laravel-searchable
Afin de rechercher parmi les modèles, vous devrez les laisser implémenter l'interface Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Il vous suffira d'ajouter une méthode getSearchResult
à chaque modèle consultable qui doit renvoyer une instance de SearchResult
. Voici à quoi cela pourrait ressembler pour un modèle d’article de blog.
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
Avec les modèles préparés, vous pouvez les rechercher comme ceci :
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
La recherche sera effectuée sans tenir compte de la casse. $searchResults
contient désormais tous les modèles User
qui contiennent john
dans l'attribut name
.
Vous pouvez également transmettre plusieurs attributs à rechercher :
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
Pour obtenir un contrôle précis, vous pouvez également utiliser un callable. De cette façon, vous pouvez également rechercher des correspondances exactes, appliquer des étendues, des relations de chargement rapides ou même filtrer votre requête comme vous le feriez avec le générateur de requêtes.
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
Vous n’êtes pas limité à enregistrer uniquement des modèles de base en tant qu’aspects de recherche. Vous pouvez facilement créer vos propres aspects de recherche personnalisés en étendant la classe SearchAspect
.
Considérez l'aspect de recherche personnalisé suivant pour rechercher une API externe :
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
Voici comment vous pouvez l'utiliser :
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
Il est possible de limiter la quantité de résultats renvoyés par chaque aspect en appelant limitAspectResults
avant d'effectuer la recherche.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Voici un exemple de rendu des résultats de recherche :
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
Vous pouvez personnaliser le $type
en ajoutant une propriété publique $searchableType
sur votre modèle ou aspect de recherche personnalisé
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.