thalfm / laravel-eloquent-filter
允许通过输入过滤器过滤 Eloquent 查询
Requires
- laravel/framework: 6.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.5
- mockery/mockery: ^1.0
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^5.4
This package is auto-updated.
Last update: 2024-09-13 05:54:20 UTC
README
此模块允许您使用查询过滤器过滤 Eloquent 数据。您可以应用 WHERE 过滤器并设置结果顺序
安装
-
在控制台运行
composer require thalfm/laravel-eloquent-filter以安装此模块
-
这就完成了!安装已完成。您无需调整任何配置或安装服务提供者。
入门
假设您想允许过滤用户数据。默认情况下,您使用 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'); }
您还可以通过实现 applyDefaultFilters 和 applyDefaultSorts 方法来实施默认的过滤器和默认的排序,在这些方法中,您可以检查是否已应用了任何过滤器或排序。
自定义
尽管此模块提供了一些默认实现,但您也可以创建自己的。您可以更改数据传递到 QueryFilter 的方式。默认情况下使用 SimpleQueryParser,它以非常基本的方式解析请求输入。然而,您可能想创建自己的 Thalfm\LaravelEloquentFilter\Contracts\InputParser 实现,以便完全满足您的需求。
您还可以更改过滤器和排序应用于查询的方式。为此,您需要创建自己的 Thalfm\LaravelEloquentFilter\Contracts\QueryFilter 实现,但同样,已提供了默认实现。
如果您只想创建 QueryFilter 的实现,创建自定义过滤器类可能更方便,该类将特定的 QueryFilter 实现传递给 QueryFilter,而不是在多个过滤器类中创建自己的构造函数。您可以参考 SimpleQueryFilter,它为 SimpleQueryParser 做了这件事,以避免在多个过滤器类中重复定义此构造函数(假设您想为它们使用 SimpleQueryParser)。
许可证
此软件包受 MIT 许可证 的许可。