basilisk / modelfilter
ModelFilter提供了一种简单的方式来过滤Eloquent模型
Requires
- php: ^8.0
- laravel/framework: ^6.0|^7.0|^8.0
This package is auto-updated.
Last update: 2024-09-16 19:33:55 UTC
README
介绍
ModelFilter是一个用于过滤Eloquent模型的Laravel包。它非常易于使用,并且可以根据您的需求进行配置。假设您想通过多个参数启用api来过滤结果,ModelFilter可以动态过滤结果并返回一个集合,或者您可能想在过滤后执行一些操作或添加其他条件,没问题,ModelFilter可以返回模型而不是集合
要求
- PHP 8.0
- Laravel 6.x, 7.x, 8.x
安装
使用Composer安装
composer require basilisk/modelfilter
支持的匹配策略
- exact:搜索等于搜索参数的字段。数值字段应始终使用精确匹配策略
- partial:搜索包含搜索参数的字段。
- start:搜索以搜索参数开头的字段。
- end:搜索以搜索参数结尾的字段。
- exist:在这种情况下,搜索键是关系名称,搜索值是布尔值,指定我们是否对关系的存在或不存在感兴趣。
配置
您需要在模型中指定过滤规则。为此,您必须在模型中添加一个名为$filtersConfigs的公共属性。 filtersConfigs接受一个关联数组,其中键指定字段和关系,值是搜索规则。例如,假设我们向User模型添加以下filtersConfigs
public $filtersConfigs = [
'id' => 'exact',
'first_name' =>'partial',
'roles:id' => 'exact',
'roles' => 'exist'
];
如上图所示,您可以根据相关模型的属性进行过滤,例如'roles:id'可以帮助您根据角色的id过滤用户。您可以链式调用任意多的关系。例如,假设User有一个名为books的关系,而Book模型有一个名为category的关系,每个category都有一个名为name的属性。对于根据用户关联的书籍的category名称过滤用户,您可以定义以下过滤规则
public $filtersConfigs = [
'books:category:name' => 'exact'
];
使用方法
要实现过滤,您只需要调用Filter Facade并传递两个参数,第一个是您定义的模型类,第二个是搜索键和值的关联数组。尽管没有关于此关联数组来源的规则,但在实际场景中,您通常从查询字符串中获取这些键值对
ModelFilterFacade::filter(User::class, $request->query())
设置查询字符串以过滤结果的一个示例如下
Base_url/users?books:category:name=fantasy&roles=true
您可以在查询字符串中为单个键定义多个值,例如,在以下示例中,所有名称部分匹配'sahand'或'salar'的用户都会被选中
Base_url/users?first_name[]:sahand&first_name[]:salar
指定返回类型
默认情况下,ModelFilter返回结果集合。但是,您可能想在返回结果之前对模型进行一些额外检查(例如,您可能想分页结果)。在这种情况下,您可以要求ModelFilter返回模型而不是集合。为此,在调用过滤方法时,只需将第三个参数指定为false即可
$user = ModelFilterFacade::filter(User::class, $request->query(), false);
$user->paginate();
为键设置多个规则
您可能想要为搜索键定义多个规则。例如,您可能想要定义一个规则,如果提供的first_name值完全匹配,则选择用户,另一个规则是部分匹配。要实现这一点,您需要像以前一样定义规则,但将过滤策略附加到搜索键上。
public $filtersConfigs = [
'first_name:exact' =>'exact',
'first_name:partial' =>'partial',
];
现在您可以动态地在运行时指定使用哪个过滤器,例如,要基于完全匹配的用户名过滤用户,可以设置查询字符串如下
Base_url/users?first_name:exact=sahand
并且要过滤部分匹配的用户,您可以这样做:
Base_url/users?first_name:partial=sah