miracuthbert / laravel-eloquent-filters
适用于 Laravel 5.8 及以上版本的优雅过滤器包
Requires
- php: ^7.3|^8.0
- illuminate/console: >=6.0
- illuminate/database: >=6.0
- illuminate/http: >=6.0
- illuminate/support: >=6.0
Requires (Dev)
- laravel/legacy-factories: >=1.0.4
- orchestra/testbench: >=6.2
- phpunit/phpunit: >=8.5
This package is auto-updated.
Last update: 2024-09-22 06:56:00 UTC
README
一个用于 Laravel 的包,可用于过滤模型记录。
它如何工作?
简单地说,这个包会检查请求查询中是否存在与模型设置的过滤键对应的键,然后构建查询。
每个模型都有一个相应的 filters
文件,其中可以注册和映射其过滤。
每个注册的 filter
都是一个包含构建查询所需功能的唯一文件。
这意味着对于具有 title
列的模型,它们可以共享相同的过滤文件,从而减少代码重复。
安装
使用 composer 安装此包
composer require miracuthbert/laravel-eloquent-filters
设置
此包利用 Laravel 自动发现,因此无需手动添加 ServiceProvider。
如果您不使用自动发现,请将 ServiceProvider 添加到 config/app.php
中的 providers 数组
Miracuthbert\Filters\EloquentFiltersServiceProvider::class
如果您想发布 config
文件,请在控制台中使用以下命令
发布配置
php artisan vendor:publish --provider=Miracuthbert\Filters\EloquentFiltersServiceProvider --tag=filters-config
用法
设置模型
模型的过滤器通常扩展 Miracuthbert\Filters\FiltersAbstract
。
它包含应用于模型的过滤器列表以及过滤器列表的 key/value
映射。
要创建一个
首先,使用 php artisan make:model
命令创建一个模型。
然后使用以下命令为模型创建一个过滤器文件
php artisan filter:model {name}
// example
php artisan filter:make UserFilters
// within specific namespace
php artisan filter:make Users\\UserFilters
将 name
替换为模型名称,最好添加后缀 Filters
以表示它是模型过滤器,例如 UserFilters
将控制台打印出的代码块复制并添加到相关模型中。不要忘记引入所需的命名空间。
在控制器中使用过滤器
设置完成后,在调用模型实例的任何控制器中,调用 filter
范围并传递一个 `Illuminate\Http\Request` 实例。
$users = User::filter($request)->get();
如果您已禁用将过滤器查询附加到分页器,则可以使用 filters_query
辅助函数手动执行此操作
$users->appends(filters_query());
// in blade view {{ $users->appends(filters_query())->links() }}
创建过滤器
默认情况下,所有创建的过滤器都将放置在 App\Filters
目录(命名空间)内。
要创建过滤器,请使用以下命令
php artisan filter:make {name}
// example
php artisan filter:make NameFilter
// within specific namespace
php artisan filter:make Users\\NameFilter
将 name
替换为过滤器的名称,例如 NameFilter
(普通过滤器)、CreatedOrder
(排序过滤器)
在创建过滤器时,最好在名称中添加
Filter
或Order
以便于使用。
然后打开过滤器文件并添加您自定义的查询功能。请参阅 filter:make
命令选项以获取一些预设模板。
过滤器基本上是扩展
Illuminate\Database\Eloquent\Builder
的代码块,因此您不受预设模板的限制。
您可以将以下选项传递给 filter:make
命令,以使用一些常见的过滤器模板
column
- 指示应实现过滤器的列bool
- 指示生成的过滤器是否应为布尔过滤器类null
- 指示生成的过滤器是否应为空检查过滤器类order
- 指示生成的过滤器是否应为排序过滤器类relation
- 为给定关系生成过滤器类
将过滤器注册到模型过滤器
创建过滤器后,要使用它,请打开模型过滤器,并在$filters
字段下注册一个键/值
对。
/** * A list of filters. * * @var array */ protected $filters = [ 'name' => NameFilter::class, 'email' => EmailFilter::class, 'created' => CreatedOrder::class, ];
设置默认过滤器
在模型过滤器中,您可以在$defaultFilters
字段下注册一个键/值
对,用于您想要默认应用的过滤器。
键
应与在$filters
字段上注册的键相同,值
应为一个实际的数据库值。
注意:默认过滤器仅应用于具有固定
或不变
值的过滤器,例如true
、false
。
/** * A list of default filters. * * @var array */ protected $defaultFilters = [ 'created' => 'desc', ];
您可以通过在模型过滤器的构造函数中添加不同的检查来覆盖默认过滤器。
// constructor if ($request->hasAny('cancelled', 'completed')) { $this->defaultFilters = [ 'upcoming' => 'false' ]; }
控制台命令
包中可用的命令
filter:model
:为模型创建一个新的过滤器类filter:make
:创建一个新的Eloquent过滤器类
传递
--help
选项到命令以获取更多使用细节
安全漏洞
如果您发现安全漏洞,请通过miracuthbert@gmail.com将电子邮件发送给Cuthbert Mirambo。所有安全漏洞都将得到及时处理。
鸣谢
许可证
该项目是开源软件,根据MIT许可证许可。