marksihor / laravel-query-filter
Laravel 查询过滤器
Requires
- php: ^8.0.0
- doctrine/dbal: *
README
安装
使用 composer 安装包
composer require marksihor/laravel-query-filter
发布配置文件(如果您愿意更改配置,则需要此步骤)
php artisan vendor:publish --provider="LaravelQueryFilter\\LaravelQueryFilterServiceProvider" --tag=config
使用方法
1. 在 Controller.php 中添加 "FiltersQueries" 特性
namespace App\Http\Controllers; ... use LaravelQueryFilter\FiltersQueries; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests, FiltersQueries; }
2. 在控制器中使用 "$this->filter()" 方法,如下所示:
namespace App\Http\Controllers; ... class PostController extends Controller { public function index(Request $request): JsonResponse { $collection = $this->filter(Post::query())->paginate(20); return response()->json([ 'data' => $collection ]); } }
#### 3. 添加公共数组 $filterableColumns = []; // (这可以通过不使用:Schema::hasColumn($table, $column) 来检查列是否存在来提高查询速度)
namespace App\Models; ... class Post extends Model { public array $filterableColumns = ['id', 'name', 'created_at', 'etc...']; }
配置
过滤器设置(configs/laravel_query_filter.php)
模型配置
配置模型有两种方法
- 传递一个参数数组(在这种情况下,它们将在每次请求中处理)
- 传递一个匿名函数(在这种情况下,可以提供额外的逻辑)
模型设置选项(如果不提供,则不会执行检查)
- 列 - 当检索记录时将显示的列
- 关系 - 允许检索和过滤的关系(空数组 - 禁止所有关系)
[ ... 'model_settings' => [ \App\Models\Post::class => function () { if (!auth()->check() || !auth()->user()->isAdmin()) { return [ 'columns' => ['id', 'title', 'text', 'user_id'], 'relations' => ['comments', 'user'] ]; } return []; }, \App\Models\User::class => [ 'columns' => ['id', 'name', 'email'], 'relations' => [] ], // class based setting, mast implement FilterSettingsInterface \App\Models\Customer::class => \App\Http\Filters\CustomerFilterSettings::class ] ]
过滤器配置
应用程序的过滤器列在 filters 数组中列出。要禁用特定过滤器,只需从列表中删除相应的类即可。添加您自己的过滤器很简单
- 在您的应用程序中创建新的过滤器类;
- 实现 \LaravelQueryFilter\Filters\FilerInterface 接口,并编写过滤器的逻辑;
- 将创建的过滤器添加到过滤器列表;
发布配置文件(如果您愿意更改配置,则需要此步骤)
php artisan vendor:publish --provider="LaravelQueryFilter\\LaravelQueryFilterServiceProvider" --tag=config
查询示例
按列过滤 (\LaravelQueryFilter\Filters\ColumnValuesFilter::class)
精确匹配
example.com/api/posts?name=Post1
包含子字符串的字符串(将可搜索的字符串用 % 字符包围)
example.com/api/posts?text=%hello%
以子字符串开头(将 % 字符放在可搜索字符串的末尾)
example.com/api/posts?text=Error%
以子字符串结尾(将 % 字符放在可搜索字符串的开头)
example.com/api/posts?text=%provident.
JSON 列过滤器(查找包含、开头、结尾的语法相同)
example.com/api/posts?data->name=John
example.com/api/posts?data__name=John
按保留词过滤 (\LaravelQueryFilter\Filters\ColumnValuesFilter::class)
值为 null 的记录
example.com/api/posts?status=null
值为 not null 的记录
example.com/api/posts?status=notNull
日期为今天的记录
example.com/api/posts?created_at=today
日期为明天的记录
example.com/api/posts?created_at=tomorrow
日期为昨天的记录
example.com/api/posts?created_at=yesterday
日期为前天
example.com/api/posts?created_at=day_before_yesterday
日期大于或等于当前日期
example.com/api/posts?created_at=future
日期小于或等于当前日期
example.com/api/posts?created_at=past
值大于或等于
example.com/api/posts?likes[from]=100
值小于或等于
example.com/api/posts?likes[to]=200
值在范围内
example.com/api/posts?likes[between]=100,200
值在列表中
example.com/api/posts?status[in]=active,disabled
值不在列表中
example.com/api/posts?status[not_in]=active,disabled
排序 (\LaravelQueryFilter\Filters\OrderFilter::class)
按升序排序
example.com/api/posts?orderBy=title&order=asc
按降序排序
example.com/api/posts?orderBy=title&order=desc
按 JSON 列排序
example.com/api/posts?orderBy=data__key&order=desc
example.com/api/posts?orderBy=data->key&order=asc
按升序/降序排序(旧方法)
example.com/api/posts?id[orderBy]=asc
example.com/api/posts?id[orderBy]=desc
选择列(\LaravelQueryFilter\Filters\SelectColumnsFilter::class)
通过提供的逗号分隔值选择列
示例:example.com/api/posts?select=id,title
检索相关记录(\LaravelQueryFilter\Filters\WithCountRelationsFilter::class)
基本
通过提供逗号分隔的关系名称直接关系
示例:example.com/api/posts?with=comments,user
通过提供点分隔的关系结构嵌套关系
示例:example.com/api/posts?with=comments.user
高级
带有额外过滤器(选择、排序、按列过滤)的直接关系
示例:example.com/api/posts?with[comments][select]=id,text,post_id&with[comments][orderBy]=id&with[comments][order] =desc&with[comments][text]=%non%
带有额外过滤器(选择、嵌套)的嵌套关系
示例:example.com/api/posts?with[user][with]=comments&with[user][select]=id&with[user][with][comments][select] =id,post_id,user_id&select=id,user_id
计数关系(\LaravelQueryFilter\Filters\WithCountRelationsFilter::class)
基本
通过提供逗号分隔的关系名称计数直接关系
示例:example.com/api/posts?withCount=comments,user
高级
通过提供关系和额外的过滤器计数直接关系
示例:example.com/api/posts?withCount[comments][user_id]=8
求和关系(\LaravelQueryFilter\Filters\WithSumRelationsFilter::class)
基本
通过提供逗号分隔的关系名称和列求和直接关系
示例:example.com/api/customers?withSum=payments.total,payments_paid.total
检索具有关系的记录(\LaravelQueryFilter\Filters\HasRelationsFilter::class)
基本
通过提供逗号分隔的关系名称
示例:example.com/api/posts?has=comments example.com/api/posts?has=comments.user
高级
通过提供带有额外过滤器的关系名称
示例:example.com/api/posts?has[comments][id]=20
检索没有关系的记录(\LaravelQueryFilter\Filters\HasNotRelationsFilter::class)
基本
通过提供逗号分隔的关系名称
示例:example.com/api/posts?hasNot=comments
高级
通过提供带有额外过滤器的关系名称
示例:example.com/api/posts?hasNot[comments][id]=13