johannesschobel / dingoquerymapper
使用Dingo/API请求查询参数来过滤Laravel模型
Requires
- php: >=5.5.0
- laravel/framework: >=5.1
This package is not auto-updated.
Last update: 2024-09-20 02:03:21 UTC
README
使用Dingo/API请求查询参数来过滤Laravel集合。例如,您可以根据URI的查询参数自动过滤、排序和限制集合。例如,您能够根据URI的查询参数自动过滤、排序和限制集合。例如,您可以根据URI的查询参数自动过滤、排序和限制集合。
安装
首先,将相应的行添加到您的composer文件中
"require" : { ... , "johannesschobel/dingoquerymapper": "dev-master" , }
然后运行composer install来安装新组件。
然后,将包中的相应ServiceProvider添加到您的config/app.php配置文件中,如下所示
'providers' => [ ... , JohannesSchobel\DingoQueryMapper\DingoQueryMapperServiceProvider::class, ],
如果您愿意,可以使用以下命令覆盖基本配置
php artisan vendor:publish --provider="JohannesSchobel\DingoQueryMapper\DingoQueryMapperServiceProvider" --tag="config"
这将把dingoquerymapper配置文件复制到您的config文件夹。使用此文件,您可以自定义limit参数或要排除在服务提供者之外的查询参数。如果您需要排除自动解析用于过滤的参数(例如,如果您使用JWT,可能希望排除token参数),这将很有用。
使用方法
示例
为了使用此插件,只需从DingoQueryMapper创建一个新的实例,并传递请求。此外,您还想从DingoQueryMapper调用相应的createFromXXX()方法,这基本上允许从各种输入(例如,Collection、Builder、...)创建映射器。
考虑以下示例
public function getAllUsers(Request $request) { $users = User::all()->get(); $qm = new DingoQueryMapper($request); $users = $qm->createFromCollection($users)->paginate(); // now return the result return response->json($users); }
如果您调用相应的URI,例如这样
/index?name=j*&age>=18&limit=10&page=3
它将输出每页最多10名用户,其中name属性以j开头,且年龄大于或等于18,从第3页开始。
Dingo/API示例
如果您使用Dingo/API作为您首选的API框架,您可以直接使用此包。如果您没有使用Dingo/API,您真的应该考虑使用它——它很棒!
然而,当使用Dingo/API时,上述所有信息仍然有效。只是返回的结果不同,因为您需要使用Dingo的响应对象。
您只需使用以下方式简单地返回结果
public function getAllUsers(Request $request) { $users = User::all()->get(); $qm = new DingoQueryMapper($request); $users = $qm->createFromCollection($users)->paginate(); // now return the result return $this->response ->paginator($users, new UserTransformer()); }
就这样——真的!
参数
此插件提供了一些预定义的参数名称,可以自动填充。
limit和page
为了限制响应元素的数量,只需添加相应的limit查询参数,如下所示
/index?limit=20
这将只返回结果中的(第一个)20个条目。为了请求下一20个条目,只需在查询中添加一个page参数,如下所示
/index?limit=20&page=2
将返回位于第2页的下一20个条目。
排序
为了使用不同的参数对结果进行排序,您只需使用,连接它们。为了提供ASC和DESC排序,您可以在相应的属性前添加一个-。排序不区分大小写。
例如
/index?sort=age,-name
按年龄(升序)排序结果,然后按名称(降序;注意name字段前的-!)
自定义过滤器
当然,您可以将自定义查询参数传递给构建器以过滤请求的数据。例如
name=j*:过滤所有以j开头的元素age>=18: 过滤所有年龄为18或更高的元素,city!=berlin: 过滤所有城市不是berlin的元素
如果尝试使用模型中不存在的列进行过滤,该列将被忽略。
目前,此插件提供以下运算符
=--> 比较等于!=--> 比较不等于<--> 小于<=--> 小于或等于=>--> 大于或等于>--> 大于
当然,您可以将过滤器与其他查询参数组合使用
/index?name=j*&age>=18&sort=age,-name&limit=20
将返回前20个元素,其中name以j开头,年龄为>= 18,按age ASC和name DESC排序。