cerbero / query-filters
根据查询参数过滤 Laravel Eloquent 模型。
Requires
- php: ^5.6||^7.0||^8.0
- illuminate/console: >=5.4
- illuminate/database: >=5.4
- illuminate/http: >=5.4
- illuminate/support: >=5.4
Requires (Dev)
- mockery/mockery: ^1.3
- orchestra/testbench: >=3.4
- phpunit/phpunit: >=5.4
- squizlabs/php_codesniffer: ^3.0
README
Query Filters 主要是受到了 Laracasts 上的这个课程 的启发,它提供了一种简单的方式来基于 HTTP 请求的查询参数过滤 Eloquent 模型。
安装
通过 Composer
composer require cerbero/query-filters
如果你的 Laravel 版本低于 5.5,可以通过在 config/app.php
文件中添加以下行来注册此包的服务提供者
'providers' => [ ... Cerbero\QueryFilters\Providers\QueryFiltersServiceProvider::class, ]
此包包含一个查询过滤器类的生成器,默认生成在 app/QueryFilters
目录下。如果你希望使用不同的路径,可以在运行后通过在 config/query_filters.php
文件中设置它
php artisan vendor:publish --tag=query_filters_config
使用方法
假设有一个用于索引数据库中存储的所有演员的路由。此路由接受查询参数来过滤记录,例如
/actors?won_oscar&acting=0&acted-in=2000
在这种情况下,路由需要只显示至少获得过一次奥斯卡的演员,他们不再在演艺界,但在 2000 年有过表演。
这可以通过生成一个查询过滤器类并可选地通过以下 Artisan 命令定义允许的查询参数和相关变量名称来实现
php artisan make:query-filters ActorFilters 'won_oscar&acting=bool&acted-in=year'
该命令将生成并填充 ActorFilters
类的过滤器
use Cerbero\QueryFilters\QueryFilters; /** * Filter records based on query parameters. * */ class ActorFilters extends QueryFilters { /** * Filter records based on the query parameter "won_oscar" * * @return void */ public function wonOscar() { // $this->query } /** * Filter records based on the query parameter "acting" * * @param mixed $bool * @return void */ public function acting($bool) { // $this->query } /** * Filter records based on the query parameter "acted-in" * * @param mixed $year * @return void */ public function actedIn($year) { // $this->query } }
请注意,过滤器名称与相关的查询参数的骆驼峰式形式相同。
只有当查询参数在 HTTP 请求中以非空值存在时,才会应用过滤器,除非它们不需要值来功能(例如 won_oscar
)。
$query
属性让过滤器确定应用过滤器时查询如何更改
public function wonOscar() { $this->query->where('oscars', '>', 0); } public function acting($bool) { $this->query->where('acting', $bool); } public function actedIn($year) { $this->query->whereHas('movies', function ($movies) use ($year) { $movies->whereYear('release_date', '=', $year); }); }
定义过滤器后,Eloquent 模型可以通过使用 FiltersRecords
特性来应用它们
use Cerbero\QueryFilters\FiltersRecords; use Illuminate\Database\Eloquent\Model; class Actor extends Model { use FiltersRecords; }
最后,在你的路由中,你可以通过调用模型的 filterBy()
方法并传递查询过滤器来过滤演员
use App\Actor; use App\QueryFilters\ActorFilters; ... public function index(ActorFilters $filters) { return Actor::filterBy($filters)->get(); }
或者,你可以从纯数组中填充查询过滤器
use App\Actor; use App\QueryFilters\ActorFilters; use Illuminate\Http\Request; ... public function index(Request $request) { $filters = ActorFilters::hydrate($request->query()); return Actor::filterBy($filters)->get(); }
有时你可能想在不有效时静默跳过过滤器。而不是在 HTTP 请求中设置验证规则,你可以在查询过滤器类中定义它们。
这避免了失败的验证停止过滤过程,并且只应用有效的过滤器,同时忽略验证未通过的值。
class ActorFilters extends QueryFilters { protected function getRules() { return [ 'acting' => 'bool', 'acted-in' => 'int|digits:4', ]; } }
变更日志
请参阅 CHANGELOG 了解最近的变化。
测试
composer test
贡献
请参阅 CONTRIBUTING 和 CONDUCT 了解详细信息。
安全
如果你发现任何与安全相关的问题,请通过电子邮件 andrea.marco.sartori@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。