mnabialek/laravel-eloquent-filter

允许通过输入过滤器过滤 Eloquent 查询

v0.1.3 2021-02-03 15:51 UTC

README

Build Status Coverage Status Scrutinizer Code Quality StyleCI Packagist

此模块允许您使用查询过滤器过滤 Eloquent 数据。您可以使用 WHERE 过滤器并设置结果顺序

安装

  1. 在控制台运行

    composer require mnabialek/laravel-eloquent-filter

    以安装此模块

  2. 完成了!安装已完成。您无需调整任何配置或安装服务提供者。

入门

假设您想允许过滤用户数据。默认情况下,您使用 User Eloquent 模型获取用户。要启用过滤,打开 User 模型(默认为 app/User.php 文件),并向其中添加以下特质

use \Mnabialek\LaravelEloquentFilter\Traits\Filterable;

在类定义之前,它应该看起来像这样

class User extends Authenticatable
{
    use \Mnabialek\LaravelEloquentFilter\Traits\Filterable;

要允许此类进行过滤,您还需要创建 Mnabialek\LaravelEloquentFilter\Contracts\QueryFilter 接口的实现。为此,创建一个包含以下内容的 app/Filters 目录文件

<?php

namespace App\Filters;

use Mnabialek\LaravelEloquentFilter\Filters\SimpleQueryFilter;

class UserFilter extends SimpleQueryFilter
{
    protected $simpleFilters = ['id','created_at'];
    
    protected $simpleSorts = ['id','email','created_at'];
}

如您所见,您在这里没有实现整个合约,而是只扩展了 SimpleQueryFilter 类,它为您完成了这项工作。

现在,您需要前往获取用户数据的位置。假设在您的控制器中,您使用

$users = User::get();

现在,您只需要将其更改为

$users = User::filtered(\App::make(\App\Filters\UserFilter::class))->get();

显然,您可以使用方法依赖注入来代替在这里使用 App::make,但这只是一个简单的示例,它应该在您的应用程序的所有位置上都能正常工作。

现在,假设您使用 https:///users URL 显示您的用户。

进行这些更改后运行

  • https:///users?id=2 - 应仅显示 ID 为 2 的用户
  • https:///users?id[]=2&id[]=5 - 应显示 ID 为 2 和 ID 为 5 的用户
  • https:///users?sort=created_at,-email - 应按 created_at 顺序升序和 email 降序显示用户。

简单查询解析器和简单查询过滤器

虽然您可以创建自定义解析器和过滤器,但提供了一些默认选项。

默认情况下,您可以通过字段和值来传递到 URL 的条件,例如 id=5,并且您可以使用以逗号分隔的字段名称的 sort 参数应用排序。如果字段前面有 - 符号,则假设您想要按该字段降序排序。

当实现您的过滤器类时,当在 $simpleFilters$simpleSorts 中扩展 SimpleQueryParser 时,您可以指定任何可能被过滤和排序的字段,而无需任何自定义实现。对于这些字段,将使用简单的 = 比较操作,并且在数组使用的情况下(例如 id[]=2&id[]=5),将假设您想要获取具有逻辑 OR 运算符的数据。

然而,在现实生活中,您可能想要指定自定义的过滤或排序方法。为此,您需要为该字段实现自定义方法,例如

对于 created_at 过滤器,您可以使用

protected function applyCreatedAt($value)
{
    $this->query->whereRaw('DATE(created_at) = ? ', [$value]);
}

对于 id 排序,您可以使用例如

protected function applySortId($order)
{
   $this->query->orderBy('id',$order)->orderBy('email','asc');
}

您还可以通过实现 applyDefaultFiltersapplyDefaultSorts 方法来应用默认的过滤和排序,在这些方法中,您可以检查是否已应用了任何过滤或排序。

自定义

尽管此模块提供了一些默认实现,但您也可以创建自己的。您可以根据需要更改将数据传递给 QueryFilter 的方式。默认情况下使用 SimpleQueryParser 解析请求输入,但它非常基础。但是,您可能想要创建自己的 Mnabialek\LaravelEloquentFilter\Contracts\InputParser 实现来完全适应您的需求。

您还可以更改查询中应用过滤器和使用排序的方式。为此,您需要创建自己的 Mnabialek\LaravelEloquentFilter\Contracts\QueryFilter 实现,但同样,默认实现已经提供。

如果您只想创建 QueryFilter 的实现,创建一个自定义的过滤器类可能更方便,该类将这个特定的 QueryFilter 实现传递给 QueryFilter,而不是在多个过滤器类中创建自己的构造函数。您可以查看 SimpleQueryFilter,它为 SimpleQueryParser 做了这件事,以避免在多个过滤器类中反复定义这个构造函数(假设您想要为它们使用 SimpleQueryParser)。

许可协议

此软件包受 MIT 许可协议 许可。