dorvidas / laravel-query-builder
轻松从API请求构建Eloquent查询
Requires
- php: ^7.1
- illuminate/database: ~5.5.0|~5.6.0|~5.7.0|~5.8.0
- illuminate/http: ~5.5.0|~5.6.0|~5.7.0|~5.8.0
- illuminate/support: ~5.5.0|~5.6.0|~5.7.0|~5.8.0
- rapidwebltd/array_undot: ^1.0
Requires (Dev)
- mockery/mockery: ^1.0.0
- orchestra/testbench: ~3.7.0|~3.8.0
- phpunit/phpunit: ^7.0|^8.0
This package is auto-updated.
Last update: 2024-09-07 15:44:26 UTC
README
此包允许您根据请求过滤和包含Eloquent关系。过滤甚至在关系上也是可能的。查询参数名称尽可能遵循JSON API规范。
基本用法
通过检查列是否等于值来过滤API请求: /users?filter[eq:active]=1
或 /users?filter[active]=1
(如果没有定义过滤器,则使用默认的eq
过滤器)
$users = User::buildFromRequest() ->get(); // all `User`s that with columns `active` equal to 1
从API请求请求过滤关系: /users?filter[posts.eq:published]=1&include=posts
$users = User::buildFromRequest() ->get(); // all `User`s with their published `posts` loaded
从API请求请求深度过滤关系: /users?filter[posts.comments.eq:approved=1&include=posts.comments
$users = User::buildFromRequest() ->get(); // all `User`s with their `posts` and post `comments` that are approved
因为buildFromRequest
基本上是一个Eloquent宏,所以它很好地与现有查询一起工作: /users?filter[eq:name]=John
$users = User::buildFromRequest() ->where('active', 1) ->get(); // all `User`s whose name is `John` also enforcing them to be active users
安装
您可以通过composer安装此包
composer require dorvidas/laravel-query-builder
您可以选择使用以下命令发布配置文件:
php artisan vendor:publish --provider="Dorvidas\QueryBuilder\QueryBuilderServiceProvider" --tag="config"
用法
过滤器
开箱即用的过滤器
有一些开箱即用的过滤器可以直接使用。过滤器列在配置中
'filters' => [ 'eq' => \Dorvidas\QueryBuilder\Filters\EqFilter::class,//Equals 'neq' => \Dorvidas\QueryBuilder\Filters\NotEqFilter::class,//Not equals 'in' => \Dorvidas\QueryBuilder\Filters\InFilter::class,// In 'nin' => \Dorvidas\QueryBuilder\Filters\NotInFilter::class, //Not in 'gt' => \Dorvidas\QueryBuilder\Filters\GreaterThanFilter::class,//Greater than 'gte' => \Dorvidas\QueryBuilder\Filters\GreaterThanEqualFilter::class,//Greater than equals 'lt' => \Dorvidas\QueryBuilder\Filters\LowerThanFilter::class,//Less than 'lte' => \Dorvidas\QueryBuilder\Filters\LowerThanEqualFilter::class,//Less that equals 'like' => \Dorvidas\QueryBuilder\Filters\LikeFilter::class,//Like 'nlike' => \Dorvidas\QueryBuilder\Filters\NotLikeFilter::class,//Not like 'n' => \Dorvidas\QueryBuilder\Filters\NullFilter::class,//Null 'nn' => \Dorvidas\QueryBuilder\Filters\NotNullFilter::class,//Not null ],
在URL中使用过滤器
JSON:API对过滤策略是中立的。唯一的要求是过滤器必须放在&filter
查询参数中。建议的过滤器格式
&filter[eq:id]=1
- 列id
等于1。分号后面的部分称为过滤器属性。如果有多个过滤器,可以使用&filter[between:from,to]=2018,2019
。&filter[posts.eq:id]=1
- 定义对关系posts
的过滤器。如果关系是深层的,我们定义完整的路径到它posts.comments.eq:id=1
。
创建过滤器
如果您需要创建自定义过滤器,请添加配置。
'filters' => [ /* ... */ 'recent' => \App\Filters\RecentFilter::class,
过滤器应实现 Dorvidas\QueryBuilder\FiltersFilterInterface
接口。示例过滤器
use Carbon\Carbon; use Dorvidas\QueryBuilder\Filters\FilterInterface; class RecentFilter implements FilterInterface { public function apply($query, $value, $params) { $col = isset($params[0]) ? $params[0] : 'created_at'; $query->where($col, '>', Carbon::now()->subDay($value)->toDateTimeString()); } }
注意事项
没有值的过滤器不会被应用,即$filter[eq:id]=
。Laravel应用程序使用\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
中间件将空查询参数转换为null
值,并且要过滤列值为null
的行,请使用n:your_col=1
过滤器。这样做的原因是当使用像Swagger这样的文档工具时,我列出端点的所有可能的过滤器,并且当值不存在时,我希望跳过它。
包含关系
JSON:API允许请求相关资源。这是通过include
查询参数完成的,例如/users?include=posts
$users = User::buildFromRequest() ->get(); // all `User`s with their `posts` // User model needs to have relation `posts`
包含约束
您可以添加允许的包含约束。如果没有,您可以请求所有内容,只要请求了定义的关系即可,例如/users?include=posts
//This is fine $users = User::buildFromRequest((new Constraints())->allowIncludes(['posts'])) ->get(); //This is also fine $users = User::buildFromRequest((new Constraints())->allowIncludes(['posts.comments'])) ->get(); // This will throw `IncludeNotAllowedException` exception because no relations allowed $users = User::buildFromRequest((new Constraints())->allowIncludes([])) ->get();
手动构建查询
您也可以通过使用buildFromArray
宏并传递\Dorvidas\QueryBuilder\ArrayBuilder
实例来手动构建查询
$items = App\User::buildFromArray( (new \Dorvidas\QueryBuilder\ArrayBuilder) ->filters([ 'in:id' => [1, 2] ]) ->includes([ 'posts' => ['eq:active' => 1], 'posts.owner' => [], //no filters 'posts.comments' => ['eq:approved' => 1], 'posts.comments.owner' => [], ]) )->get();
稀疏字段 - TODO
排序 - TODO
分页 - TODO
限制结果 - TODO
测试
composer test
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。