johannesschobel/dingoquerymapper

使用Dingo/API请求查询参数来过滤Laravel模型

dev-master 2019-05-06 06:12 UTC

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()方法,这基本上允许从各种输入(例如,CollectionBuilder、...)创建映射器。

考虑以下示例

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());
}

就这样——真的!

参数

此插件提供了一些预定义的参数名称,可以自动填充。

limitpage

为了限制响应元素的数量,只需添加相应的limit查询参数,如下所示

/index?limit=20

这将只返回结果中的(第一个)20个条目。为了请求下一20个条目,只需在查询中添加一个page参数,如下所示

/index?limit=20&page=2

将返回位于第2页的下一20个条目。

排序

为了使用不同的参数对结果进行排序,您只需使用,连接它们。为了提供ASCDESC排序,您可以在相应的属性前添加一个-。排序不区分大小写。

例如

/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个元素,其中namej开头,年龄为>= 18,按age ASCname DESC排序。