Pipeline は Laravel の複数条件クエリをどのように処理しますか?

藏色散人
リリース: 2022-01-11 09:57:35
転載
1909 人が閲覧しました

次のチュートリアルコラムでは、Pipeline が Laravel の複数条件クエリを処理する方法を紹介します。 元のタイトル: Pipeline を使用した Laravel Eloquent Query Filter 元のリンク: hafiqiqmal93.medium.com/laravel-eloquent-query-sfilter-using-pipeline-7c6f2673d5da


pipeline

は、Laravel の特に便利な機能の 1 つです。パイプラインは、ミドルウェアなど、Laravel で最もよく使用されるコンポーネントの 1 つでもあります。

Laravel の便利な機能の 1 つは、パイプライン

です。パイプラインは、ミドルウェアなど、Laravel で最もよく使用されるコンポーネントの 1 つです。

基本的には、パイプを介してタスク スタックにオブジェクトを渡し、コールバックを介して結果を取得できます。

基本的に、パイプラインを使用すると、タスクのスタックを介してオブジェクトを渡し、コールバックを介して結果を取得できます。

クエリ フィルタリングにおけるパイプラインの利点は、次のとおりです。大量のたわごとを数行に減らすことができます。パイプラインを使用する前は、通常、ユーザー モデルの Eloquent インスタンスを取得し、クエリ文字列に基づいていくつかの条件を結合するコントローラーを作成しました。

クエリ フィルタリングのパイプラインの利点は、大量の行を数行に削減できることです。パイプラインを意識しないため、通常はコントローラーをセットアップし、ユーザー モデルの Eloquent のインスタンスを取得します。を選択し、クエリ文字列に基づいて条件を適用します。

以下の Shishan クエリ メソッドを見てみましょう。

以下のクエリを見てみましょう。

$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();
ログイン後にコピー
欠点は明らかです。フィルター条件が山のように積み重なり、重複コードが大量に表示されます。 。さらに、コードの保守性も少し頭の痛い問題です。

欠点は、明らかにフィルター条件が増大し続けることと、他のクエリに対する同じフィルターの重複が発生することです。一方で、コードの保守性は頭痛の種です。

パイプラインのエレガントな処理方法を見てみましょう

パイプラインがヒーローになる場所があります

return User::query()->filter([ 
    UsernameFilter::class,
    EmailFilter::class,
    AddressFilter::class,
    OccupationFilter::class])->get();
ログイン後にコピー

シンプルで短いですよね。次の手順を見てください。シンプルで短いですよね?その前に、

1.「Filterable」という名前の特性クラスを作成し、スコープ メソッドを作成します

Filterable
という名前の特性を作成し、スコープを作成します
  1. <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class Filterable{         public function scopeFilter($query, array $through)        {                     return app(Pipeline::class)                    -&gt;send($query)                                -&gt;through($through)                                -&gt;thenReturn();            }}</pre><div class="contentsignin">ログイン後にコピー</div></div>これで、モデルの再利用で問題なく使用できるようになります。ユーザー モデル
などのそれを次に、ユーザー モデル

class User {
    use Filterable; }
ログイン後にコピー
2などの任意のモデルで使用します。フィルターを作成します。例:

UsernameFilter

2. 例: UsernameFilter

class UsernameFilter {
    public function handle($query, $next)
    {        
        if (request()->mobile_phone) {           
           $query->where('username', request()->mobile_phone);      
        }         
        return $next($query);  
    }}
ログイン後にコピー
手順:
などのフィルターを作成します。使い方はこんな感じです

User::query()->filter([UsernameFilter::class])->get();
ログイン後にコピー

or

or

あなたはまだパイプですプロパティを渡すことで使用できます。

パイプラインへのアクセスをさらに容易にしたい場合は、属性を渡すこともできます。

class StringFilter {
    public function handle($query, $next, $column) {
        if (request()->{$column}) {           
            $query->where($column, 'LIKE', request()->{$column});      
        } 
        return $next($query); 
    }}
ログイン後にコピー
このように使用します

使用法これはまさにこのようなものです。

User::query()->filter([
   'StringFilter:username',
   'StringFilter:email',])->get();
ログイン後にコピー
それをやり遂げて、エレガントに!

完了。シンプルでクリーン

推奨: 「

最新の 5 つの Laravel ビデオ チュートリアル
」 ##

以上がPipeline は Laravel の複数条件クエリをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート