mehdi-fathi / eloquent-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次,因此我决定发布4.0版本,增加了2个新功能。
当前版本支持
- 支持与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的provider中
'providers' => [ /* * Package Service Providers... */ eloquentFilter\ServiceProvider::class ]
3- 添加外观 'EloquentFilter' => eloquentFilter\Facade\EloquentFilter::class
到 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
数组
User::setWhiteListFilter(['name']);
向白名单过滤器添加新字段
User::addWhiteListFilter('name');
-注意 万一的话,你必须在模型中设置 $whiteListFilter
。此方法的目的在于防止恶意用户操纵查询字符串。
条件指南表
- 为了更好地理解这一点,我提供了一个包含所有条件和示例的表格。它表示 Eloquent 过滤器如何检测参数以及每个参数将执行什么样的查询。
简单示例
你只需传递查询字符串形式的数据。例如
简单的 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
如果你要按类似条件进行查询,可以按照此示例操作。
/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 过滤器的相同代码。请检查代码部分。这不是很棒吗?
$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 过滤器默认不支持所有条件。在这种情况下,你可以创建一个重写方法。如果你要创建自己的查询过滤器,可以轻松实现。你应该注意在新版本中在使用方法名之前使用 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 过滤器使用的所有参数。你可以设置键来获取特定的索引。例如EloquentFilter::filterRequests('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 ]; } }
- 查询参数中的每个都在
WhereRelationLikeCondition
中检测,默认由 Eloquent Filter 检测。
在上面的例子中,创建 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
方法中设置集合数据,以创建自己的自定义条件而无需查询字符串。
-注意 因此,您必须取消perpage
参数的设置。您只能设置page
参数来分页,此参数将忽略过滤器。
- 您可以通过以下代码忽略某些请求参数。
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有一个魔法方法,用于更改在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; } }
如上代码所示,您可以在Eloquent Filter运行之前,在serializeRequestFilter
方法中修改模型的每个查询参数。这是一个实用的方法,当您想设置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
是一个用于构建器/数据库检查是否使用了 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请求。我们欢迎各种贡献,包括错误修复、新功能和文档改进。
提议的功能(正在考虑中)
我们一直在努力改进我们的包,并为即将推出的版本计划了以下功能
- 可配置的过滤器预设:实现定义和保存过滤器预设的能力。此功能将使用户能够快速应用常见的过滤器集合,而无需每次都指定它们。
您的贡献始终受到欢迎!如果您想帮助开发这些功能。
许可证
Eloquent Filter 是开源软件,受 MIT 许可证 许可。
联系方式
如果您对 Eloquent Filter 有任何疑问或反馈,请随时通过 mehdifathi.developer@gmail.com 联系我们。我们很高兴听到您的意见!
致谢
我们想感谢 Laravel 社区对我们这个项目的支持和贡献。