dorvidas/laravel-query-builder

轻松从API请求构建Eloquent查询

v0.0.3 2019-03-06 21:04 UTC

This package is auto-updated.

Last update: 2024-09-07 15:44:26 UTC


README

Build Status Latest Stable Version Total Downloads License

此包允许您根据请求过滤和包含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)。有关更多信息,请参阅许可证文件