eloquent-filter / filter
Eloquent Filter 可自动将自定义过滤器添加到您的 Laravel Eloquent 模型中。它易于使用且完全动态,只需发送查询字符串即可。
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- illuminate/container: ~8.0|~9.0|~10.0|~11.0
- illuminate/database: ~8.0|~9.0|~10.0|~11.0
- illuminate/pagination: ~8.0|~9.0|~10.0|~11.0
- illuminate/support: ~8.0|~9.0|~10.0|~11.0
Requires (Dev)
- mockery/mockery: 1.4.x-dev|1.4.2|1.5.1|^1.6
- orchestra/testbench: 5.*|^6.0|^6.6.0|^7.0.0|^8.0.0|v9.0.0
- phpstan/phpstan: ^1.8
- phpunit/phpunit: 8.3|8.5|9.3|^9.5|10.5.5
- dev-master
- 4.4.5
- 4.4.0
- 4.3.5
- 4.3.0
- 4.2.0
- 4.1.5
- 4.1.0
- 4.0.8
- 4.0.1
- 4.0.0
- 3.4.0
- 3.3.9
- 3.3.7
- 3.3.5
- 3.3.0
- 3.2.0
- 3.1.0
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.6.7.x-dev
- 2.6.7
- 2.6.5
- 2.6.0
- 2.5.7
- 2.5.6
- 2.5.4
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.8
- 2.4.6
- 2.4.5
- 2.4.4
- 2.4.3
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.9
- 2.3.8
- 2.3.7
- 2.3.5
- 2.3.2
- 2.3.0
- 2.2.5
- 2.2.1
- 2.1.9
- 2.1.5
- 2.1.0
- 2.0.9
- 2.0.0
- 1.6.9
- 1.6.7.x-dev
- 1.6.7
- 1.6.5.x-dev
- 1.6.5
- 1.6.2
- 1.6.0.x-dev
- 1.6.0
- 1.5.8
- 1.5.7
- 1.5.6
- 1.5.5
- 1.5.3.x-dev
- 1.5.3
- 1.5.2.x-dev
- 1.5.2
- 1.5.1.x-dev
- 1.5.1
- 1.5.0.x-dev
- 1.5.0
- 1.4.3
- 1.4.2
- 1.4.1.x-dev
- 1.4.1
- 1.4.0
- 1.3.2
- 1.3.0
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.2
- 1.0.1
- 1.0.0
- dev-mehdi-dev
- dev-develop
- dev-mehdi-fathi-patch-2
- dev-analysis-dj1n7w
- dev-analysis-Dy2QG9
- dev-analysis-JG25Bv
- dev-analysis-6V4pm9
- dev-analysis-ne4GK1
- dev-laravel-9
- dev-revert-187-master
- dev-v-2.4
- dev-analysis-BMaQOr
- dev-analysis-jLboA2
- dev-analysis-d0bvPj
- dev-analysis-nNwZ00
- dev-analysis-QMJD3Z
- dev-analysis-5ZnoAj
- dev-analysis-yvBJrG
- dev-analysis-QMy14w
- dev-analysis-64Y11P
- dev-analysis-64YDd6
- dev-analysis-aj1pyZ
- dev-analysis-m4RDBV
- dev-analysis-0gxgnW
- dev-analysis-m43AaV
- dev-analysis-VrkmpB
- dev-analysis-L3kKOn
- dev-analysis-9m1295
- dev-analysis-YjdPkY
- dev-analysis-64lRQo
- dev-analysis-nNG5jv
- dev-analysis-4xQVwN
- dev-analysis-ajG51o
- dev-analysis-bQ2D2w
- dev-analysis-64lm9M
- dev-v-2.3
- dev-analysis-e7kOa7
- dev-analysis-m46eME
- dev-analysis-4x61je
- dev-analysis-0gDjvw
- dev-analysis-rdMpE3
- dev-analysis-WN3pxN
- dev-analysis-ZlBKpg
- dev-analysis-M1Nr52
- dev-analysis-jLMBrZ
- dev-analysis-ajE5l7
- dev-analysis-wj5Qk9
- dev-analysis-BMQP9L
- dev-analysis-L3xWAk
- dev-analysis-kayoD4
- dev-analysis-Yj0wJy
- dev-v-2
- dev-analysis-ZlrB6Y
- dev-analysis-BMxxr7
- dev-analysis-0gKymM
- dev-analysis-7aQA56
- dev-analysis-4xRmon
- dev-analysis-646w2W
- dev-analysis-7aQW56
- dev-analysis-d0WMNJ
- dev-analysis-jLWBbZ
- dev-analysis-J2J97v
- dev-analysis-YjQ2eo
- dev-analysis-L3ol5n
- dev-analysis-YjMw9A
- dev-analysis-gOeoB1
- dev-analysis-0gAA5j
- dev-analysis-9mynDa
- dev-analysis-e7j7D2
- dev-analysis-2QvelB
- dev-analysis-wj0xnK
- dev-analysis-yvExnj
- dev-analysis-2Qv9gZ
- dev-analysis-rdEoOD
- dev-analysis-gO1Vnk
- dev-analysis-NApk94
- dev-analysis-WNl60e
- dev-analysis-4x7l6n
- dev-analysis-BMyb0W
- dev-mock-test-relation
- dev-analysis-VrY9l3
- dev-analysis-NADlve
- dev-mock-test
- dev-analysis-nNLR6g
- dev-analysis-5ZPy9x
- dev-analysis-3wWojA
- dev-mehdi-fathi-patch-1
- dev-mehdi-travic-ci
- dev-analysis-Px5ZNP
- dev-analysis-Vrjnl6
- dev-analysis-ajVmmB
- dev-analysis-KZoo76
- dev-mehdi-fathi-working-4
- dev-analysis-q1Vobv
- dev-analysis-8AZ3Dl
- dev-analysis-qyyvdN
- dev-analysis-8A0Vw9
- dev-analysis-Xk1bxJ
- dev-analysis-zYGJR9
- dev-analysis-8bw3e2
- dev-analysis-XaPGJo
- dev-analysis-8mQ51V
- dev-analysis-zerKYP
- dev-analysis-86WAgl
- dev-analysis-z922wP
- dev-analysis-8LWdA6
- dev-analysis-qMmmnl
- dev-analysis-qvAA4x
- dev-mehdi-fathi-working-2
- dev-analysis-zRB9wp
- dev-analysis-XZV7JD
- dev-analysis-XkGPe1
- dev-analysis-zOwneB
- dev-analysis-XWOeZP
- dev-mehdi-fathi-working
- dev-analysis-XZV7eg
- dev-analysis-zEZawD
- dev-revert-2-master
- dev-add-stickler-config
This package is auto-updated.
Last update: 2024-09-09 13:22:53 UTC
README
Eloquent Filter 是一个强大的 Laravel 扩展包,提供了一种直观的方式来使用查询字符串过滤 Eloquent 模型。它非常适合构建响应式 API 和复杂的数据集,并与 Laravel 的现有 Eloquent 模型无缝集成,通过最少的设置即可添加强大的动态过滤功能。
功能
- 支持复杂的查询结构
- 易于覆盖条件以实现自定义行为
- 与 Laravel 和 Eloquent(包括查询构建器)和谐集成
- 完全控制过滤执行和定制
我们已经将 Eloquent Filter 定制得尽可能灵活——无论您的查询是简单还是复杂。凭借其丰富的功能集,您可以轻松实现适用于应用程序的特定功能。
注意 我们考虑了您希望无论简单还是复杂都实现的可预测功能,尽管我们有很多功能可以用来实现您特定的其他功能。
目录
需求
- PHP 8.0,8.1,8.2
- Laravel 8.x,9.x,10.x,11.x(新)
版本信息
最近 Eloquent Filter 的安装量已超过 100,000 次,因此我决定发布带有 2 个新功能的 4.0 版本。
当前版本支持
- 支持与 Eloquent 一起使用查询构建器
- 为自定义方法设置特定名称
🎤 简介
如果你在一个端点中执行任务,并且有一些带有许多高级选项的查询,可能会遇到挑战。
比如说,我们想要制作一个具有多个过滤选项的高级搜索页面。
没有 Eloquent Filter 的简单实现
资源 URI 将看起来像这样
/users/index?age_more_than=25&gender=male&created_at=25-09-2019
控制器中的简单实现将像这样
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; class UserController extends Controller { public function index(Request $request) { $users = User::where('is_active', true); if ($request->has('age_more_than')) { $users->where('age', '>', $request->age_more_than); } if ($request->has('gender')) { $users->where('gender', $request->gender); } if ($request->has('created_at')) { $users->where('created_at','>=', $request->created_at); } return json_encode($users->get()); } }
这个解决方案简单且效果良好,但并不适用于企业项目。您需要为每个所需的过滤器添加条件。特别是如果您要执行更复杂的过滤,您的代码可能会迅速变得一团糟!💥
因此,Eloquent Filter 准备好了帮助您摆脱复杂性,同时节省时间。
使用 Eloquent Filter 的简单实现
Eloquent Filter 可以帮助您解决这个问题。只需设置查询字符串即可使用它。它会自动且系统化地生成您的查询,同时您也可以控制它们。
安装 Eloquent Filter 后,请求 URI 将如下所示
/users/list?age_more_than[operator]=>&age[value]=35&gender=male&created_at[operator]==>&created_at[value]=25-09-2019
在控制器中,您只需要这一行
/** * Class UsersController. */ namespace App\Http\Controllers; use App\User; class UsersController { public function list() { return User::filter()->get(); } }
通过 Eloquent Filter 的实现,您可以使用所有文档中记录的过滤器!
🔌 安装
1- 在您的项目目录中运行以下命令,将 Eloquent Filter 添加为依赖项
$ composer require mehdi-fathi/eloquent-filter
-
注意 对于小于 5.8 的 Laravel 版本,您应安装版本 2.2.5
$ composer require mehdi-fathi/eloquent-filter:2.2.5
-
注意 我们支持自动发现,但您也可以检查它们。
2- 将 eloquentFilter\ServiceProvider::class
添加到 app.php 中的提供者
'providers' => [ /* * Package Service Providers... */ eloquentFilter\ServiceProvider::class ]
3- 添加外观 'EloquentFilter' => eloquentFilter\Facade\EloquentFilter::class
到 aliases app.php
'alias' => [ /* * Facade alias... */ 'EloquentFilter' => eloquentFilter\Facade\EloquentFilter::class, ],
就这样,享受吧!💥
📖 基本用法
配置模型并设置白名单
将 Filterable
特性添加到您的模型中,并在白名单数组中设置您想要使用过滤器字段的名称。您也可以在模型中重写此方法。
use eloquentFilter\QueryFilter\ModelFilters\Filterable; class User extends Model { use Filterable; private static $whiteListFilter =[ 'id', 'username', 'email', 'created_at', 'updated_at', ]; }
- 您可以将
*
字符设置为所有字段的过滤器,如下例所示
private static $whiteListFilter = ['*'];
您可以在方法中动态添加或设置 $whiteListFilter
。例如
设置数组到 WhiteListFilter
- 注意 此方法会覆盖
$whiteListFilter
数组
User::setWhiteListFilter(['name']);
向 WhiteListFilter 添加新字段
User::addWhiteListFilter('name');
-注意 万一,您必须在模型中设置 $whiteListFilter
。该方法的目标是防止恶意用户操作查询字符串。
条件指南表
- 为了更好地理解这一点,我提供了一个所有条件和示例的表格。它表示 eloquent filter 如何检测参数以及每个参数会生成什么查询。
简单示例
您只需将数据作为查询字符串传递。例如
简单的 Where
/users/list?email=mehdifathi.developer@gmail.com
SELECT ... WHERE ... email = 'mehdifathi.developer@gmail.com'
/users/list?first_name=mehdi&last_name=fathi
SELECT ... WHERE ... first_name = 'mehdi' AND last_name = 'fathi'
- 如果您发送的日期格式为
Y-m-d
,我们将像 Laravel 的WhereDate()
方法一样工作。
/users/list?created_at=2024-09-01
SELECT ... WHERE ... strftime('%Y-%m-%d', "created_at") = cast(2024-09-01 as text)
Where In
此示例会生成 whereIn
方法。
/users/list?username[]=ali&username[]=ali22&family=ahmadi
SELECT ... WHERE ... username in ('ali','ali22') AND family = 'ahmadi'
OrWhere
此示例会生成 orWhere()
方法。
/users/list?name=mehdi&username=fathi&or[username]=ali
SELECT ... WHERE ... name = 'mehdi' AND username = 'fathi' or username = 'ali'
Where like
如果您打算通过 like 条件进行查询。您可以通过此示例来完成。
/users/list?first_name[like]=%John%
SELECT ... WHERE ... first_name LIKE '%John%'
Where 通过操作符
您可以在查询字符串中设置任何 MySQL 操作符。
/users/list?count_posts[operator]=>&count_posts[value]=35
SELECT ... WHERE ... count_posts > 35
/users/list?username[operator]=!=&username[value]=ali
SELECT ... WHERE ... username != 'ali'
/users/list?count_posts[operator]=<&count_posts[value]=25
SELECT ... WHERE ... count_posts < 25
Where 嵌套关系模型
您可以通过查询字符串中的查询字符串数组设置所有嵌套关系。想象一下,用户模型与帖子有关联。帖子表与订单表有关联。
您可以通过在查询字符串中设置 posts[count_post]
和 posts[orders][name]
来创建查询条件。
- 请注意,您必须在 User 模型中设置
posts.count_post
和posts.orders.name
。
use eloquentFilter\QueryFilter\ModelFilters\Filterable; class User extends Model { use Filterable; private static $whiteListFilter =[ 'username', 'posts.count_post', 'posts.category', 'posts.orders.name', ]; /** * @return \Illuminate\Database\Eloquent\Relations\belongsTo */ public function posts() { return $this->belongsTo('Models\Post'); } }
/users/list?posts[count_post]=876&username=mehdi
select * from "users" where exists
(select * from "posts" where "posts"."user_id" = "users"."id"
and "posts"."count_post" = 876)
and "username" = "mehdi"
- 上述示例是您使用的没有 eloquent filter 的相同代码。请检查代码。这不是很棒吗?
$builder = (new User())->with('posts'); $builder->whereHas('posts', function ($q) { $q->where('count_post', 876); })->where('username','mehdi');
Where 数组嵌套关系模型
您可以通过传递数组来创建 whereIn 条件。
/users/list?posts[category][]=php&posts[category][]=laravel&posts[category][]=jquery&username=mehdi
select * from "users" where exists
(select * from "posts" where
"posts"."category" in ('php','laravel','jquery') )
and "username" = "mehdi"
Doesnthave Where(新功能)
/tags/list?doesnt_have=category
select * from "tags" where not exists (select * from "categories" where "tags"."foo_id" = "categories"."id")'
- 为了获取与模型没有任何关系的那些数据,就像
Doesnthave
方法一样工作。
特殊参数
您可以在查询字符串中设置特殊参数 limit
和 orderBy
来根据该参数进行查询。
/users/list?f_params[limit]=1
SELECT ... WHERE ... order by `id` desc limit 1 offset 0
/users/list?f_params[orderBy][field]=id&f_params[orderBy][type]=ASC
SELECT ... WHERE ... order by `id` asc
/users/list?f_params[orderBy][field]=id,count_posts&f_params[orderBy][type]=ASC
SELECT ... WHERE ... order by `id` asc, `count_posts` asc
Where between
如果您打算基于日期进行查询,您必须在查询字符串中填写 start
和 end
键。因此,您可以将它作为查询字符串设置。这些参数用于按日期过滤。
/users/list?created_at[start]=2016/05/01&created_at[end]=2017/10/01
SELECT ... WHERE ... created_at BETWEEN '2016/05/01' AND '2017/10/01'
高级 Where
/users/list?count_posts[operator]=>&count_posts[value]=10&username[]=ali&username[]=mehdi&family=ahmadi&created_at[start]=2016/05/01&created_at[end]=2020/10/01
&f_params[orderBy][field]=id&f_params[orderBy][type]=ASC
select * from `users` where `count_posts` > 10 and `username` in ('ali', 'mehdi') and
`family` = ahmadi and `created_at` between '2016/05/01' and '2020/10/01' order by 'id' asc limit 10 offset 0
因此,查询字符串的字段与您的模型中 $whiteListFilter
的数据库表字段相同或声明为重写方法。重写方法可以被视为自定义查询过滤器。
自定义查询过滤器
Eloquent Filter 默认不支持所有条件。在这种情况下,您可以创建一个重写方法。如果您打算创建自己的查询过滤器,可以轻松完成。您应该在方法名称前使用 filterCustom
。
您应该运行命令来创建特性并在模型上使用它
php artisan eloquentFilter:filter users
namespace App\ModelFilters; use Illuminate\Database\Eloquent\Builder; /** * Trait UsersFilter. */ trait UsersFilter { /** * This is a sample custom query * @param \Illuminate\Database\Eloquent\Builder $builder * @param $value * * @return \Illuminate\Database\Eloquent\Builder */ public function filterCustomSample_like(Builder $builder, $value) { return $builder->where('username', 'like', '%'.$value.'%'); } }
-注意 这些查询字符串的字段与特性中的方法相同。在您的模型中使用特性
/users/list?sample_like=a
select * from `users` where `username` like %a% order by `id` desc limit 10 offset 0
use App\ModelFilters\UsersFilter; class User extends Model { use UsersFilter,Filterable; protected $table = 'users'; protected $guarded = []; private static $whiteListFilter =[ 'id', 'username', 'email', 'created_at', 'updated_at', ]; }
一些过滤器方法
User::filter()->paginate();
-
EloquentFilter::filterRequests()
:获取 Eloquent Filter 使用的所有参数。您可以通过设置键来获取特定索引。例如EloquentFilter::filterRequests('username')
获取 username 索引。 -
EloquentFilter::getAcceptedRequest()
:获取通过 AcceptRequest 方法设置的参数。 -
EloquentFilter::getIgnoredRequest()
: 获取通过getIgnoreRequest方法设置的忽略参数。
自定义检测条件
有时您可能想要创建自定义条件来执行Eloquent Filter默认不支持的新查询。好消息是从现在开始,您可以在Eloquent Filter中创建自定义条件。
您可以在检查后生成新查询的条件。例如
我们必须有两个类。第一个类检测条件,第二个类生成查询。
- 步骤1:创建一个用于检测一些条件的类
use eloquentFilter\QueryFilter\Detection\Contract\ConditionsContract; /**`` * Class WhereRelationLikeCondition. */ class WhereRelationLikeCondition implements ConditionsContract { /** * @param $field * @param $params * @param $is_override_method * * @return string|null */ public static function detect($field, $params, $is_override_method = false): ?string { if (!empty($params['value']) && !empty($params['limit']) && !empty($params['email'])) { $method = WhereRelationLikeConditionQuery::class; } return $method ?? null; } }
- 步骤2:紧接着,创建一个用于生成查询的类。在这个例子中,我们创建了一个
WhereRelationLikeConditionQuery
类。
use eloquentFilter\QueryFilter\Queries\BaseClause; use Illuminate\Database\Eloquent\Builder; /** * Class WhereRelationLikeConditionQuery. */ class WhereRelationLikeConditionQuery extends BaseClause { /** * @param $query * * @return Builder */ public function apply($query): Builder { return $query ->whereHas('posts', function ($q) { $q->where('comment', 'like', "%" . $this->values['like_relation_value'] . "%"); }) ->where("$this->filter", '<>', $this->values['value']) ->where('email', 'like', "%" . $this->values['email'] . "%") ->limit($this->values['limit']); } }
- 步骤3:您创建一个名为
EloquentFilterCustomDetection
的方法,用于在模型中返回条件检测数组。
use eloquentFilter\QueryFilter\ModelFilters\Filterable; class User extends Model { use Filterable; private static $whiteListFilter =[ 'username', 'posts.count_post', 'posts.category', 'posts.orders.name', ]; /** * @return \Illuminate\Database\Eloquent\Relations\belongsTo */ public function posts() { return $this->belongsTo('Models\Post'); } public function EloquentFilterCustomDetection(): array { return [ WhereRelationLikeCondition::class ]; } }
- 在首次检查默认Eloquent Filter检测之后,每个查询参数都会在
WhereRelationLikeCondition
中使用。
在上述例子中创建方法EloquentFilterCustomDetection
并返回条件类数组。
/users/list?username[value]=mehdi&username[limit]=10&username[email]=mehdifathi&username[like_relation_value]=mehdi&count_posts=10
select * from "users"
where exists (select * from "posts" where
"users"."post_id" = "posts"."id"
and "comment" like ?) and "username" <> ? and "email" like ? and "count_posts" = ? limit 10
只需运行代码User::filter();
即可查看结果。
Model::setLoadInjectedDetection(false)
:您可以在运行时禁用自定义检测条件。
注意同样,您可以通过使用方法SetCustomDetection
在运行时设置自定义检测。例如
$users = User::SetCustomDetection([WhereRelationLikeCondition::class])->filter();
注意您可以通过以下代码禁用EloquentFilterCustomDetection
User::SetLoadDefaultDetection(false)->filter();
注意您可以设置多个检测条件。例如
class User extends Model { use Filterable; public function EloquentFilterCustomDetection(): array { return [ WhereRelationLikeCondition::class, WhereRelationLikeVersion2Condition::class, WhereRelationLikeVersion3Condition::class, ]; } }
EloquentFilter::getInjectedDetections()
获取所有自定义注入检测。
注意每个自定义检测都会在默认的Eloquent Filter检测之前运行。
配置
您可以将配置文件发布以进一步自定义该包。
发布配置
php artisan vendor:publish --provider="eloquentFilter\ServiceProvider"
配置
-
您可以在配置文件(eloquentFilter.php)中禁用/启用Eloquent Filter。
'enabled' => env('EloquentFilter_ENABLED', true),
-
Eloquent Filter识别查询字符串中的每个参数。也许您有一个Eloquent Filter不希望识别的查询字符串。您可以使用
ignoreRequest
来实现这个目的。但我们有一个更干净的处理方法。您可以在配置文件中设置参数request_filter_key
。因此,每个查询字符串都会通过request_filter_key
参数来识别。'request_filter_key' => '', // filter
例如,如果您设置'request_filter_key' => 'filter',
那么Eloquent Filter将识别filter
查询字符串。
/users/list?filter[email]=mehdifathi.developer@gmail.com
-
您可以在配置文件(eloquentFilter.php)中禁用/启用Eloquent Filter的所有自定义检测。
'enabled_custom_detection' => env('EloquentFilter_Custom_Detection_ENABLED', true),
-
您应该设置一个索引数组
ignore_request
以忽略所有过滤器。'ignore_request' => [] //[ 'show_query','new_trend' ],
-
最好保持
max_limit
。它是一个限制,用于防止开发者或恶意用户意外或故意生成糟糕的查询。'max_limit' => 20
-
通过
filtering_keys
,您有一个地方可以声明一些提供的键并在过滤中使用它们。'filtering_keys'=>[ 'title_sport_advanced' => [ 'title' => 'sport', 'created_at' => [ 'start' => '2019-01-01 17:11:46', 'end' => '2019-02-06 10:11:46', ], 'sub_cat' => [ 'news 1', 'news 2' ], ] ]
然后您只需要传递
config('eloquentFilter.filtering_keys.title_sport_advanced')
到过滤方法。 -
从现在开始,我们有了通过日志记录实例记录日志的能力。由于查询是动态创建的,因此需要保留查询及其时间的功能。因此,我们在此版本中添加了它,并添加了一些其他选项以更好地管理。
'log' => [ 'has_keeping_query' => false, 'max_time_query' => null, 'type' => 'eloquentFilter.query' ]
默认情况下是禁用的,您可以通过has_keeping_query
启用它,type
是日志类型,而max_time_query
是用于保留执行时间较长的查询的值。
别名
有时您可能想在URL中更改一些参数,这些参数引用了模型的字段。例如,输入表单的名称与模型不相似,或者您可能出于其他原因想更改它们,那么别名作为一个新功能可能很有用。
class Stat extends Model { use Filterable; /** * @var array */ private static $whiteListFilter = [ 'type', 'national_code', ]; /** * @var array */ private $aliasListFilter = [ 'national_code' => 'code', ]; }
然后您应该通过在URL中发送code
参数来查询模型的国籍代码字段。
查询构建器简介
好消息!
很多人向我请求增加新功能以支持Laravel查询构建器。这需要大量的精力和投入时间,所以我决定实现它。然而,尽管非常困难,现在它几乎完成了。
从现在开始,我们支持查询构建器和Eloquent。你不仅可以使用查询构建器,还可以同时使用Eloquent。
这是一个新功能,我现在正忙于代码中修复问题。无论如何,这个功能现在已经上线,但还有一些限制。目前我们不支持查询构建器的WhereCustomCondition
和WhereHas
,但其他条件都可以使用。此外,我们没有任何类型的whitelist
、blacklist
、custom detection
或alias
。目前,这只是一个简单的功能。
- 它们的用法就像模型一样,你只需要使用过滤器作为方法。显然,不需要像使用特质等任何改变。
DB::table('users')->filter();
魔术方法
魔法方法是一系列你可以用作Eloquent Filter包装的方法。例如,在过滤前序列化数据或更改响应中的数据等。现在Eloquent Filter有serializeRequestFilter
、ResponseFilter
等。
请求方法
调用ignoreRequest
(静态作用域)或ignoreRequestFilter
将忽略你不希望在Eloquent Filter条件中使用的一些请求。
按照以下示例更改Laravel项目的控制器代码:
$users = User::ignoreRequest(['name']) ->filter() ->with('posts') ->orderByDesc('id') ->paginate(request()->get('perpage'),['*'],'page');
$user = new User(); $users = $user->ignoreRequestFilter(['name','family']) ->filter() ->with('posts') ->orderByDesc('id') ->paginate(request()->get('perpage'),['*'],'page');
-注意 Eloquent Filter默认使用查询字符串在Laravel中执行查询。尽管如此,你可以设置模型中的filter
方法的数据集,以创建自己的自定义条件而无需查询字符串。
-注意 因此你必须取消你自己参数的设置,比如每页数。你只能设置分页的页参数,该参数将被过滤器忽略。
- 你可以通过使用以下代码忽略一些请求参数。
User::ignoreRequest(['perpage']) ->filter() ->paginate(request()->get('perpage'), ['*'], 'page');
例如:perpage
参数永远不会出现在Eloquent Filter的条件中。这与分页方法有关。page
参数默认在Laravel的Eloquent Filter中被忽略。
- 你可以将一些请求参数过滤为可接受的过滤。
调用AcceptRequest
(静态作用域)或acceptRequestFilter
将接受你想要在Eloquent Filter条件中使用的请求。例如:username
和id
键将包含在Eloquent Filter的条件中。
`` User::AcceptRequest(['username','id']) ->filter() ->paginate(request()->get('perpage'), ['*'], 'page');
$user = new User(); $user->acceptRequestFilter(['username','id']) ->filter() ->paginate(request()->get('perpage'), ['*'], 'page');
请求过滤器
Eloquent Filter有一个用于在处理之前更改注入请求的魔法方法。这个方法是SerializeRequestFilter
。你只需在模型中实现SerializeRequestFilter
方法。例如:
class User extends Model { use Filterable; private static $whiteListFilter =[ 'username' ]; public function serializeRequestFilter($request) { $request['username'] = trim($request['username']); return $request; } }
如上代码所示,你可以在serializeRequestFilter
方法中修改模型的所有查询参数,在Eloquent Filter运行之前。这是一个实用的方法,当你想要设置user_id或转换日期或删除空格等。
请求字段类型转换过滤器
Eloquent Filter在过滤过程之前需要为每个字段提供一系列特定的方法。这个功能最近已经实现。通过在模型中使用filterSet
+ field
方法,你将为特定字段添加一些更改。
class Category extends Model { use Filterable; private static $whiteListFilter =[ 'desc' ]; public function filterSetDesc($value) { return trim($value); } }
响应过滤器
响应过滤器是在Eloquent Filter处理之后更改响应的覆盖方法。该方法称为getResponseFilter
,你可以在模型中实现getResponseFilter
方法。例如:
class User extends Model { use Filterable; public function getResponseFilter($response) { $data['data'] = $response; return $data; } }
- 你可以在
getResponseFilter
方法中传递一个回调函数以更改响应。我们只在查询构建器的数据库中有这个功能。
$categories = DB::table('categories')->filter()->getResponseFilter(function ($out) { $data['data'] = $out; return $data; });
黑名单检测
显然,你不希望所有能够通过操作请求来获取数据用户。因此,我们最好有一个Eloquent控制功能。尽管我们在请求端有这个能力,但我们还需要在Eloquent端有这个功能。
我们将设置一个黑名单检测来防止使用它来创建条件。因此,该列表在创建条件时已被禁用。例如:
namespace App\Http\Controllers; /** * Class UsersController. */ class UsersController { public function list() { $users = User::setBlackListDetection( [ 'WhereCondition', ] )->filter() ->orderByDesc('id') ->paginate(); } }
- 你可以在模型层设置。使用
black_list_detections
数组来完成这个目的。
<?php namespace Tests\Models; use eloquentFilter\QueryFilter\ModelFilters\Filterable; use Illuminate\Database\Eloquent\Model; class Car extends Model { use Filterable; private static $whiteListFilter = '*'; protected $black_list_detections = [ 'WhereCondition', ]; }
宏方法
-isUsedEloquentFilter
是一个用于构建器/DB的宏方法,用于检查查询是否使用了eloquent-filter。
《getDetectionsInjected》是一个宏方法,用于获取注入对象列表数组。
例如:
$users = User::SetCustomDetection([WhereRelationLikeCondition::class])->filter(); echo $users->isUsedEloquentFilter(); // will true echo $users->getDetectionsInjected(); // will showing a list array of injected objects $categories = DB::table('categories')->filter(); echo $categories->isUsedEloquentFilter(); // will true
贡献
如果您想为Eloquent Filter做出贡献,请fork仓库并创建一个pull request。我们欢迎所有类型的贡献,包括错误修复、新功能和文档改进。
提议的功能(正在考虑中)
我们一直在努力改进我们的包,并为即将发布的版本计划了以下功能:
- 可配置的过滤器预设:实现定义和保存过滤器预设的功能。此功能将允许用户快速应用常见的过滤器集合,而无需每次都指定它们。
您的贡献始终受到欢迎!如果您想帮助开发这些功能。
许可证
Eloquent Filter是开源软件,许可协议为MIT许可证。
联系
如果您对Eloquent Filter有任何疑问或反馈,请随时通过mehdifathi.developer@gmail.com联系我们。我们非常愿意听到您的声音!
致谢
我们想感谢Laravel社区对该项目的支持和贡献。