Ce package Laravel vous permet de rechercher parmi plusieurs modèles Eloquent. Il prend en charge le tri, la pagination, les requêtes étendues, les relations de chargement rapides et la recherche dans une ou plusieurs colonnes.
❤️ Nous sommes fiers de soutenir la communauté en développant des packages Laravel et en les distribuant gratuitement. Si ce package vous fait gagner du temps ou si vous comptez dessus professionnellement, pensez à sponsoriser la maintenance et le développement et consultez notre dernier package premium : Inertia Table. Garder une trace des problèmes et des demandes de tirage prend du temps, mais nous sommes heureux de vous aider !
Si vous souhaitez en savoir plus sur l'historique de ce package, veuillez lire l'article de blog.
Vous pouvez installer le package via composer :
composer require protonemedia/laravel-cross-eloquent-search
get
a été renommée search
.addWhen
a été supprimée au profit de when
.updated_at
dans la plupart des cas. Si vous n'utilisez pas d'horodatage, il utilisera désormais la clé primaire par défaut. startWithWildcard
a été renommée en beginWithWildcard
.getUpdatedAtColumn
. Auparavant, il était codé en dur dans updated_at
. Vous pouvez toujours utiliser une autre colonne pour trier.allowEmptySearchQuery
et la classe EmptySearchQueryException
ont été supprimées, mais vous pouvez toujours obtenir des résultats sans effectuer de recherche. Commencez votre requête de recherche en ajoutant un ou plusieurs modèles à rechercher. Appelez la méthode add
avec le nom de classe du modèle et la colonne dans laquelle vous souhaitez effectuer la recherche. Appelez ensuite la méthode search
avec le terme de recherche et vous obtiendrez une instance IlluminateDatabaseEloquentCollection
avec les résultats.
Les résultats sont triés par défaut par ordre croissant selon la colonne mise à jour . Dans la plupart des cas, cette colonne est updated_at
. Si vous avez personnalisé la constante UPDATED_AT
de votre modèle ou écrasé la méthode getUpdatedAtColumn
, ce package utilisera la colonne personnalisée. Si vous n'utilisez pas du tout d'horodatage, il utilisera la clé primaire par défaut. Bien sûr, vous pouvez également commander via une autre colonne.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Si vous vous souciez de l'indentation, vous pouvez éventuellement utiliser la new
méthode sur la façade :
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Il existe également une méthode when
pour appliquer certaines clauses en fonction d'une autre condition :
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
Par défaut, nous divisons le terme de recherche et chaque mot-clé recevra un symbole générique pour effectuer une correspondance partielle. En pratique, cela signifie que le terme de recherche apple ios
donnera apple%
et ios%
. Si vous souhaitez également commencer par un symbole générique, vous pouvez appeler la méthode beginWithWildcard
. Cela entraînera %apple%
et %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Remarque : dans les versions précédentes de ce package, cette méthode était appelée startWithWildcard()
.
Si vous souhaitez désactiver le comportement selon lequel un caractère générique est ajouté aux termes, vous devez appeler la méthode endWithWildcard
avec false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
La recherche de plusieurs mots est prise en charge dès le départ. Enveloppez simplement votre phrase entre guillemets.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Vous pouvez désactiver l'analyse du terme de recherche en appelant la méthode dontParseTerm
, qui vous donne les mêmes résultats que l'utilisation de guillemets doubles.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Si vous souhaitez trier les résultats selon une autre colonne, vous pouvez transmettre cette colonne à la méthode add
en tant que troisième paramètre. Appelez la méthode orderByDesc
pour trier les résultats par ordre décroissant.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Vous pouvez appeler la méthode orderByRelevance
pour trier les résultats selon le nombre d'occurrences des termes de recherche. Imaginez ces deux phrases :
Si vous recherchez Apple iPad , la deuxième phrase apparaîtra en premier, car il y a plus de correspondances avec les termes de recherche.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
Le classement par pertinence n'est pas pris en charge si vous effectuez une recherche dans des relations (imbriquées).
Pour trier les résultats par type de modèle, vous pouvez utiliser la méthode orderByModel
en lui donnant votre ordre préféré des modèles :
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
Nous vous recommandons fortement de paginer vos résultats. Appelez la méthode paginate
avant la méthode search
et vous obtiendrez une instance de IlluminateContractsPaginationLengthAwarePaginator
en conséquence. La méthode paginate
prend trois paramètres (facultatifs) pour personnaliser le paginateur. Ces arguments sont les mêmes que ceux du paginateur de base de données de Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Vous pouvez également utiliser une pagination simple. Cela renverra une instance de IlluminateContractsPaginationPaginator
, qui ne tient pas compte de la longueur :
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Au lieu du nom de la classe, vous pouvez également transmettre une instance du générateur de requêtes Eloquent à la méthode add
. Cela vous permet d'ajouter des contraintes à chaque modèle.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Vous pouvez effectuer une recherche dans plusieurs colonnes en passant un tableau de colonnes comme deuxième argument.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Vous pouvez rechercher des relations (imbriquées) en utilisant la notation par points :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Vous pouvez utiliser la recherche en texte intégral de MySQL en utilisant la méthode addFullText
. Vous pouvez effectuer une recherche dans une ou plusieurs colonnes (à l'aide d'index de texte intégral) et vous pouvez spécifier un ensemble d'options, par exemple pour spécifier le mode. Vous pouvez même mélanger des recherches classiques et en texte intégral dans une seule requête :
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Si vous souhaitez effectuer une recherche dans les relations, vous devez transmettre un tableau où la clé du tableau contient la relation, tandis que la valeur est un tableau de colonnes :
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL dispose d'un algorithme soundex intégré qui vous permet de rechercher des termes qui se prononcent presque de la même manière. Vous pouvez utiliser cette fonctionnalité en appelant la méthode soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
Pas grand chose à expliquer ici, mais cela est également pris en charge :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Vous appelez la méthode search
sans terme ou avec un terme vide. Dans ce cas, vous pouvez supprimer le deuxième argument de la méthode add
. Avec la méthode orderBy
, vous pouvez définir la colonne sur laquelle trier (auparavant le troisième argument) :
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Vous pouvez compter le nombre de résultats avec la méthode count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Vous pouvez utiliser includeModelType
pour ajouter le type de modèle au résultat de la recherche.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
Par défaut, il utilise la clé type
, mais vous pouvez la personnaliser en passant la clé à la méthode.
Vous pouvez également personnaliser la valeur type
en ajoutant une méthode publique searchType()
à votre modèle pour remplacer le nom de base de classe par défaut.
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
Vous pouvez utiliser l'analyseur avec la méthode parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
Vous pouvez également transmettre un rappel comme deuxième argument pour parcourir chaque terme :
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Inertia Table
: la table ultime pour Inertia.js avec le générateur de requêtes intégré.Laravel Blade On Demand
: Package Laravel pour compiler des modèles Blade en mémoire.Laravel Eloquent Scope as Select
: arrêtez de dupliquer les portées et les contraintes de vos requêtes Eloquent en PHP. Ce package vous permet de réutiliser les étendues et contraintes de vos requêtes en les ajoutant en tant que sous-requête.Laravel FFMpeg
: Ce package fournit une intégration avec FFmpeg pour Laravel. Le stockage des fichiers est géré par le système de fichiers de Laravel.Laravel MinIO Testing Tools
: exécutez vos tests sur un serveur MinIO S3.Laravel Mixins
: Une collection de goodies Laravel.Laravel Paddle
: Intégration de l'API Paddle.com pour Laravel avec prise en charge des webhooks/événements.Laravel Task Runner
: écrivez des scripts Shell comme les composants Blade et exécutez-les localement ou sur un serveur distant.Laravel Verify New Email
: Ce package ajoute la prise en charge de la vérification des nouvelles adresses e-mail : lorsqu'un utilisateur met à jour son adresse e-mail, il ne remplacera pas l'ancienne tant que la nouvelle n'est pas vérifiée.Laravel XSS Protection
: Laravel Middleware pour protéger votre application contre le Cross-site scripting (XSS). Il nettoie les entrées de requête et peut nettoyer les instructions d'écho de Blade.Si vous découvrez des problèmes liés à la sécurité, veuillez envoyer un e-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.
Ce paquet est Treeware. Si vous l'utilisez en production, nous vous demandons d' acheter un arbre au monde pour nous remercier de notre travail. En contribuant à la forêt Treeware, vous créerez des emplois pour les familles locales et restaurerez les habitats fauniques.