basilisk/modelfilter

ModelFilter提供了一种简单的方式来过滤Eloquent模型

dev-main 2021-08-16 12:33 UTC

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