Maison > cadre php > Laravel > le corps du texte

Comment Pipeline gère-t-il les requêtes multi-conditions de Laravel ?

藏色散人
Libérer: 2022-01-11 09:57:35
avant
1900 Les gens l'ont consulté

pour présenter à Pipeline comment gérer la requête multi-conditions de Laravel, j'espère que cela sera utile à tout le monde ! Titre original : Laravel Eloquent Query Filter using PipelineLien original : hafiqiqmal93.medium.com/laravel-eloquent-query-sfilter-using-pipeline-7c6f2673d5da


pipeline

est l'une des fonctionnalités particulièrement utiles de Laravel . Le pipeline est également l'un des composants les plus couramment utilisés dans Laravel, comme le middleware.

L'une des fonctionnalités de Laravel qui est sûrement utile est le pipeline

. Les pipelines sont l'un des composants les plus utilisés dans le middleware de Laravel par exemple.

Fondamentalement, via des tuyaux, nous pouvons transmettre des objets à travers la pile de tâches, Et obtenez le résultat par rappel.

Fondamentalement, avec un pipeline, nous pouvons faire passer un objet à travers une pile de tâches et obtenir le résultat via un rappel.

L'avantage des pipelines pour le filtrage des requêtes est que nous pouvons réduire des tonnes de conneries à quelques lignes. Avant d'utiliser des pipelines, nous écrivions généralement un contrôleur pour obtenir l'instance Eloquent du modèle utilisateur et épisser certaines conditions en fonction de la chaîne de requête.

L'avantage du pipeline pour le filtrage des requêtes est que nous pouvons réduire des tonnes de lignes à plusieurs lignes. Sans connaître les pipelines, nous configurons généralement un contrôleur, obtenons une instance du modèle Eloquent of User et appliquons des conditions basées sur des conditions. sur la chaîne de requête.

Jetons un coup d'œil à la méthode de requête Shit Mountain ci-dessous.

Voyons les requêtes ci-dessous.

$query = User::query();if ($request->username) {
    $query->where('username', 'LIKE', "%$request->username%");}if ($request->email) {
    $query->where('email', 'LIKE', "%$request->email%");}if ($request->address) {
    $query->where('address', 'LIKE', "%$request->address%");}if ($request->occupation) {
    $query->where('occupation', 'LIKE', "%$request->occupation%");}return $query->get();
Copier après la connexion
Les lacunes sont évidentes. Les conditions de filtrage s'accumulent constamment comme une montagne de merde, et il y a beaucoup de code en double. De plus, la maintenabilité du code est un peu un casse-tête.

L'inconvénient est que c'est évidemment que les conditions des filtres vont continuer à croître ainsi que la duplication du même filtre pour d'autres requêtes. D'un autre côté, la maintenabilité du code est un casse-tête.

Voyons l'élégance du pipeline.

C'est là que Pipeline devient un héros

return User::query()->filter([ 
    UsernameFilter::class,
    EmailFilter::class,
    AddressFilter::class,
    OccupationFilter::class])->get();
Copier après la connexion

Simple et court, non ? Jetez un œil aux étapes suivantesSimple et courte, n'est-ce pas ? Mais avant cela,

1. Créez une classe de traits nommée "Filterable" et écrivez une méthode de portée

Créez un trait nommé Filterable<.> et créez une portée</.>

class Filterable{ 
       public function scopeFilter($query, array $through)
       {        
            return app(Pipeline::class)
                   ->send($query)            
                   ->through($through)            
                   ->thenReturn();    
       }}
Copier après la connexion
Ensuite, vous pouvez la réutiliser avec plaisir dans n'importe quel modèle, tel que le modèle utilisateur
  1. Filterable and create a scope
class User {
    use Filterable; }
Copier après la connexion

然后,你就可以愉快的在任意Model中复用它,如User模型

Then, use it in any model that you prefer, for example User model

class UsernameFilter {
    public function handle($query, $next)
    {        
        if (request()->mobile_phone) {           
           $query->where('username', request()->mobile_phone);      
        }         
        return $next($query);  
    }}
Copier après la connexion

2.创建一个Filter,例如UsernameFilter

2. Create a filter for example UsernameFilterEnsuite, utilisez-le dans n'importe quel modèle que vous préférez, par exemple Utilisateur model

User::query()->filter([UsernameFilter::class])->get();
Copier après la connexion

2. Créez un filtre par exemple UsernameFilter

2

L'utilisation est comme ça

class StringFilter {
    public function handle($query, $next, $column) {
        if (request()->{$column}) {           
            $query->where($column, 'LIKE', request()->{$column});      
        } 
        return $next($query); 
    }}
Copier après la connexion
OR

OR

Vous pouvez. utilisez également des tuyaux en passant des attributs.

Si vous souhaitez plus d'accessibilité au pipeline, vous pouvez également transmettre un attribut.

Fait Simple et propre

Recommandé : "

Les cinq derniers didacticiels vidéo Laravel

"

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!