phatnt99 / advanced-query
强大的查询功能,用于过滤、排序和自定义Eloquent查询。
Requires
- php: ^7.2
README
此包为Eloquent Laravel提供高级查询功能。
要求
此包需要
- PHP 7.2+
安装
通过composer安装此包
composer require phatnt99/advanced-query
Laravel
此包支持自动发现,因此如果您使用Laravel 5.5或更高版本,您可能可以跳过此步骤。
将以下行添加到 config/app.php 文件中的 providers 键以添加服务提供者
Phatnt99\AdvancedQuery\QueryServiceProvider::class
使用方法
此包支持3个主要功能: 过滤、排序 和 自定义查询。
要开始使用,请运行以下Artisan命令
php artisan make:query UserQuery --fs
注意:您需要在此命令运行之前定义您的模型,查询中的User一词将用于查找现有模型。如果未提供名称对应的模型,则会显示错误并导致意外行为(但在此之后,您可以更改正确的类模型)。
--fs 选项将创建类Filter和Sort,如果您只自定义查询,则可以删除此选项。
上述命令将在 App\Queries 中创建3个文件
-Queries
|
--Filters
| |
| --UserFilter.php
| |
--Sorts
| |
| --UserSort.php
|
--UserQuery.php
详细说明
过滤
默认过滤
此包提供3个属性以节省您的时间。您不必这样做
return $query->where('name','LIKE', '%'.$name.'%'); ... return $query->where('email', '=', $email); ... return $query->whereDate('created_at', '=', date('Y-m-d'));
您可以这样做
protected $filterPartial = [ 'name' ]; protected $filterExact = [ 'email' ]; protected $filterDate = [ 'created_at' ];
这减少了编写重复代码的时间,并使执行过滤功能的类更易于阅读 :)
范围日期过滤
关于日期过滤的小贴士,如果您想过滤日期范围(从...到),请尝试这样做
protected $filterDate = [ 'from.created_at', 'to.created_at' ];
自定义过滤
有时您的过滤器与复杂的逻辑(如根据关系属性进行过滤)一起工作,过滤器类可以帮助您自定义自己的函数来执行复杂的过滤。
protected function project($projectId) { return $this->query->whereHas('projects', function ($query) use ($projectId) { $query->where('project_id', '=', $projectId); }); }
然后在查询字符串中使用函数名作为属性名。
在查询字符串中使用
您可以通过 filters 键传递要过滤的属性及其值
GET /users?filters[name]=John&filters[created_at]=2020-02-02
排序
默认排序
具体的Sort类有属性defaultSorts,您可以使用它来定义可排序的属性。
protected $defaultSorts = [ 'full_name', 'nick_name', 'dob', 'email', 'phone_number', ];
对于具有恒定方向的属性,使用enum SortDirection作为其值
protected $defaultSorts = [ ... 'dob' => SortDirection::DESCENDING, ];
注意:如果属性同时具有默认方向(如上所示)和查询字符串中的方向,则将查询字符串中的方向视为优先级更高。
在查询字符串中使用
我使用带有前缀 - 的 sort 键来执行降序排序(无表示升序)
GET /users?sort=id,-dob
查询
这是绑定包主要功能的类。您必须定义一些指向依赖类的重要属性
/** * Your model class * @var string */ protected $model = User::class; /** * Your filter class * @var string */ protected $filter = UserFilter::class; /** * Your sort class * @var string */ protected $sort = UserSort::class;
如果您使用完整命令(带有--fs选项和正确的模型)将自动为您绑定这些值(如果不使用--fs选项,则仅绑定模型类)。
只需指定依赖类(在每个依赖项中提供完整处理程序)即可使用包的主要功能。
// UserController public function index(UserQuery $query) { return response()->json( $query->filter() ->sort() ->paginate()); }
允许的属性
如果您只想允许一些属性进行过滤或排序,请将这些属性传递给 allows 参数(第二个参数)
return response()->json( $query->filter(null, ['id', 'name']) ->sort(null, ['created_at']) ->paginate());
Eloquent查询 & 高级查询
您可以直接使用Eloquent方法(where、whereHas...)与Query类实例一起使用,但会丢失链(链式方法)。更好的方法是定义自己的方法,使用这些Eloquent方法,然后返回Query实例
// UserQuery /** * Advanced Query */ public function verifiedUser() { $this->query->whereNotNull('email_verify_at'); return $this; }
分页
我使用了Eloquent模型默认的分页,允许您通过将期望页面的索引传递给 paginate()(默认为1)
其他用法
您可以单独使用每个功能。
过滤 & 排序独立
您必须设置查询属性以独立使用。示例(与排序相同的方法)
$filter = new \App\Queries\Filters\UserFilter(); $filter->setQuery(User::query());
而不是将属性(带有值)传递到查询字符串中,您可以将其传递到setAllowAttrs方法
$filter = new \App\Queries\Filters\UserFilter(); $filter->setQuery(User::query()) ->setAllowAttrs(['name' => 'John']) ->getCollection();
然后您可以使用getCollection方法轻松地获取集合结果。
顺便说一下,该软件包为过滤和排序提供了2个单独的命令
php artisan make:filter UserFilter
php artisan make:sort UserSort
编码愉快!
贡献
如果您发现某些问题或想用您的代码让它变得更好,请随意提交PR或Issue :)
许可证
MIT许可证(MIT)