次のチュートリアルコラムでは、Pipeline が Laravel の複数条件クエリを処理する方法を紹介します。 元のタイトル: Pipeline を使用した Laravel Eloquent Query Filter 元のリンク: hafiqiqmal93.medium.com/laravel-eloquent-query-sfilter-using-pipeline-7c6f2673d5da
は、Laravel の特に便利な機能の 1 つです。パイプラインは、ミドルウェアなど、Laravel で最もよく使用されるコンポーネントの 1 つでもあります。
pipeline
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
という名前の特性を作成し、スコープを作成しますなどのそれを次に、ユーザー モデル
<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) ->send($query) ->through($through) ->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 サイトの他の関連記事を参照してください。