mnabialek / laravel-eloquent-filter
允许通过输入过滤器过滤 Eloquent 查询
Requires
- laravel/framework: 5.*|6.*|7.*|8.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.5
- mockery/mockery: ^1.0
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^5.4
- dev-master
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1
- dev-dependabot/composer/symfony/http-kernel-5.4.20
- dev-dependabot/composer/guzzlehttp/guzzle-7.4.5
- dev-dependabot/composer/guzzlehttp/psr7-1.8.5
- dev-dependabot/composer/league/flysystem-1.1.4
- dev-dependabot/composer/laravel/framework-8.40.0
- dev-changes
- dev-analysis-X0nVgM
- dev-develop
This package is auto-updated.
Last update: 2024-08-30 01:38:08 UTC
README
此模块允许您使用查询过滤器过滤 Eloquent 数据。您可以使用 WHERE 过滤器并设置结果顺序
安装
-
在控制台运行
composer require mnabialek/laravel-eloquent-filter
以安装此模块
-
完成了!安装已完成。您无需调整任何配置或安装服务提供者。
入门
假设您想允许过滤用户数据。默认情况下,您使用 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'); }
您还可以通过实现 applyDefaultFilters
和 applyDefaultSorts
方法来应用默认的过滤和排序,在这些方法中,您可以检查是否已应用了任何过滤或排序。
自定义
尽管此模块提供了一些默认实现,但您也可以创建自己的。您可以根据需要更改将数据传递给 QueryFilter 的方式。默认情况下使用 SimpleQueryParser
解析请求输入,但它非常基础。但是,您可能想要创建自己的 Mnabialek\LaravelEloquentFilter\Contracts\InputParser
实现来完全适应您的需求。
您还可以更改查询中应用过滤器和使用排序的方式。为此,您需要创建自己的 Mnabialek\LaravelEloquentFilter\Contracts\QueryFilter
实现,但同样,默认实现已经提供。
如果您只想创建 QueryFilter 的实现,创建一个自定义的过滤器类可能更方便,该类将这个特定的 QueryFilter 实现传递给 QueryFilter,而不是在多个过滤器类中创建自己的构造函数。您可以查看 SimpleQueryFilter
,它为 SimpleQueryParser
做了这件事,以避免在多个过滤器类中反复定义这个构造函数(假设您想要为它们使用 SimpleQueryParser)。
许可协议
此软件包受 MIT 许可协议 许可。