wpzag / laravel-query-builder
从请求的查询字符串参数构建 Eloquent 查询。
v1.0.2
2023-02-18 21:24 UTC
Requires
- php: ^8.2
- illuminate/contracts: ^10.0
- spatie/laravel-package-tools: ^1.14.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14.4
- nunomaduro/collision: ^6.4
- nunomaduro/larastan: ^2.4.1
- orchestra/testbench: ^8.0.1
- pestphp/pest: ^1.22.4
- pestphp/pest-plugin-laravel: ^1.4
- phpstan/extension-installer: ^1.2
- phpstan/phpstan-deprecation-rules: ^1.1.1
- phpstan/phpstan-phpunit: ^1.3.4
- phpunit/phpunit: ^9.6.3
README
此包允许您根据请求查询参数进行筛选、排序、追加、分页和加载关系。
安装
您可以通过 composer 安装此包
composer require wpzag/laravel-query-builder
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="query-builder-config"
使用方法
在 query-builder.php 中为您的模型添加配置
'models' => [ User::class => [ 'includes' => ['posts.comments.author', ], 'appends' => ['fullname','avatar'], 'filterable' => ['*:except:role', 'posts.title', 'posts.body', 'posts.created_at'], 'sortable' => ['*'], 'max_per_page' => 20 ], ]
[ * ] 表示除了隐藏属性之外的所有模型属性。
[ *:except:column1,column2 ] 您也可以通过添加 :except: 然后逗号分隔的属性来排除一些属性。
[ age:exact ] 如果您使用 :exact 前缀属性,则将使用 ( = ) 操作符而不是 ( LIKE ) 操作符进行查询。
使用方法
$builder = QueryBuilder::for(User:class); //This applies includes/filters/sorts to the query $builder->query() // Returns the query $builder->get() // Returns the eloquent collection $builder->withPagination() // Applies pagination to the query $builder->withAppends() // Applies appends to the query $builder->withPaginationAndAppends() // Applies pagination & appends to the query
您还可以向 query-builder 添加自定义查询
QueryBuilder::for(User:class)->query()->where('id', '>', 1)->get(); // Or if you are using withPagination(),withAppends() or withPaginationAndAppends() : QueryBuilder::for(User:class, function($query){ //extra queries here return $next($query); })->withPaginationAndAppends();
示例
筛选
users?filter[name]=john,rose // User::where('name','like','%john%') // ->orWhere('name','like','%rose%')->get();
users?filter[name,username]=john // User::where('name','like','%john%') // ->orWhere('username','like','%rose%')->get();
users?filter[name]=john,rose&filter[age]=gt.20 // User::where('name','like','%john%') // ->orWhere('name','like','%rose%') // ->where('age','>',20)->get();
users?filter[age][between]=[29,40] // User::whereBetween('age', [29, 40])->get();
users?filter[email_verified_at][empty] // User::whereNull('email_verified_at')->get();
users?filter[created_at][date]=2020-01-01 // User::whereDate('created_at', '2020-01-01')->get();
users?filter[posts.created_at]=lt.2020-01-01 // User::whereHas('posts', function($query) { // $query->whereDate('created_at', '<', '2020-01-01'); // })->get();
users?filter[role][not-in]=[admin,teacher,student] // User::whereNotIn('role', ['admin', 'teacher', 'student'])->get();
排序
users?sort=-created_at // User::orderBy('created_at', 'desc')->get();
users?sort=-statues,name // User::orderBy('statues', 'desc')->orderBy('name', 'asc')->get();
追加
users?append=fullname // User::get()->append('fullname')
加载关系
users?include=profile,posts.comments.author // User::with('profile','posts.comments.author')->get();
分页
users?page=2&limit=10 // User::paginate(10);
测试
composer test
变更日志
请参阅 CHANGELOG 了解最近更改的详细信息。
贡献
请参阅 CONTRIBUTING 了解详细信息。
安全漏洞
请审查 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可
MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。