thalfm/laravel-eloquent-filter

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

v1.0.0 2019-11-12 18:41 UTC

This package is auto-updated.

Last update: 2024-09-13 05:54:20 UTC


README

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

安装

  1. 在控制台运行

    composer require thalfm/laravel-eloquent-filter

    以安装此模块

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

入门

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

use \Thalfm\LaravelEloquentFilter\Traits\Filterable;

在类定义下方,因此它应该看起来像这样

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

要允许过滤此类,您还需要创建 Thalfm\LaravelEloquentFilter\Contracts\QueryFilter 接口的实现。要做到这一点,创建一个最小 app/Filters 目录文件,内容如下

<?php

namespace App\Filters;

use Thalfm\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 降序显示用户。

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

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

默认情况下,您可以通过使用字段和值(例如 id=5)将条件传递到 URL,并且您可以使用带有字段名称的逗号分隔的 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,它以非常基本的方式解析请求输入。然而,您可能想创建自己的 Thalfm\LaravelEloquentFilter\Contracts\InputParser 实现,以便完全满足您的需求。

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

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

许可证

此软件包受 MIT 许可证 的许可。