Maison  >  Article  >  cadre php  >  Comment Pipeline gère-t-il les requêtes multi-conditions de Laravel ?

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

藏色散人
藏色散人avant
2022-01-10 15:25:531828parcourir

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();
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();

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();    
       }}
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; }

然后,你就可以愉快的在任意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);  
    }}

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();

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); 
    }}
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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer