wpzag/laravel-query-builder

从请求的查询字符串参数构建 Eloquent 查询。

v1.0.2 2023-02-18 21:24 UTC

This package is auto-updated.

Last update: 2024-09-19 01:01:52 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

此包允许您根据请求查询参数进行筛选、排序、追加、分页和加载关系。

安装

您可以通过 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)。请参阅 许可文件 了解更多信息。