davidoc26 / eloquent-filter
构建查询的简单过滤器系统
Requires
- php: >=8.0
- illuminate/container: ^8.0 || ^9.0 || ^10.0
- illuminate/database: ^8.0 || ^9.0 || ^10.0
- illuminate/support: ^8.0 || ^9.0 || ^10.0
Requires (Dev)
- ext-pdo_sqlite: *
- orchestra/testbench: ^6.0 || ^v7.0 || ^8.0
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.17
README
构建查询的简单过滤器系统
要求
- PHP 8.0+
- Laravel 8, 9, 10
安装
composer require davidoc26/eloquent-filter
介绍
过滤器允许您对查询应用限制/规则。就像中间件。
有两种类型的过滤器
- 过滤器
- RequestFilter(提供对Request实例的访问)
过滤器也可以 具有自己的参数(使用HasArguments特质)
用法
使用Filterable
要开始使用过滤器,您需要在您的模型上使用 Filterable 特质。
use Davidoc26\EloquentFilter\Traits\Filterable; class Post extends Model { use Filterable; }
要定义过滤器,覆盖您模型中的 getFilters() 方法并返回过滤器。如果没有定义过滤器,则不会执行过滤。
public function getFilters(): array { return [ FirstFilter::class, SecondFilter::class => ['argument' => 20], // As mentioned above, filters can have their own arguments. ]; }
创建新的过滤器
要创建一个基本过滤器,请使用以下命令:
php artisan make:filter MyFilter
此命令将在 app/Filters 目录中创建一个过滤器。
use Davidoc26\EloquentFilter\Filters\Filter; class MyFilter extends Filter { public function filter(Builder $builder, Closure $next): Builder { // return $next($builder); } }
创建新的RequestFilter
如果您需要一个具有Request实例的过滤器,请创建一个RequestFilter
php artisan make:request-filter MyRequestFilter
use Davidoc26\EloquentFilter\Filters\RequestFilter; class MyRequestFilter extends RequestFilter { public function filter(Builder $builder, Closure $next): Builder { // $this->request return $next($builder); } }
过滤器参数
如果您希望您的过滤器具有参数(例如默认值),请在您的过滤器上使用 HasArguments 特质。
要设置参数,在您的模型的 getFilters() 方法中指定它们
public function getFilters(): array { return [ LimitFilter::class => ['limit' => 10], // For convenience, specify the arguments in an array. ]; }
然后,您可以在过滤器中使用动态属性来获取您的参数
use Davidoc26\EloquentFilter\Filters\RequestFilter; use Davidoc26\EloquentFilter\Traits\HasArguments; class LimitFilter extends RequestFilter { use HasArguments; public function filter(Builder $builder, Closure $next): Builder { // If there is no limit in the request, we use the limit specified in the model. $builder->when( $this->request->input('limit', $this->limit), fn(Builder $builder, $limit) => $builder->limit($limit) ); // Note that you must always return this. return $next($builder); } }
要查看您在模型中定义的所有参数,请使用 getArguments() 过滤器方法
过滤器包
过滤器包允许您将多个过滤器收集在一个包中。过滤器包的主要目的是将相同的过滤器应用于模型。
要创建过滤器包,请使用以下命令:
php artisan make:filter-pack MyFilterPack
它将在 app/Filters/Packs 目录中创建过滤器包
<?php namespace App\Filters\Packs; use Davidoc26\EloquentFilter\Packs\FilterPack; class MyFilterPack extends FilterPack { public function getFilters(): array { return [ // Define your filters here. ]; } }
然后您可以将过滤器包应用于您的模型
Post::withFilterPacks([MyFilterPack::class])->get(); // The meaning of the filter pack is that you can use it on any model that uses the Filterable trait User::withFilterPacks([ MyFilterPack::class, SecondFilterPack::class, ])->get();
应用过滤器
要应用 getFilters() 方法中指定的过滤器,请在您的模型上使用 filter()。
Post::filter()->get(); // You can also pass additional filters: Post::filter([OrderByFilter::class])->get();
要仅使用您需要的过滤器,请使用 withFilters() 方法并将其传递到其中,此方法将忽略您在模型中指定的过滤器。
Post::withFilters([ LoadRelationshipFilter::class, OffsetFilter::class ])->get();