cerbero/query-filters

根据查询参数过滤 Laravel Eloquent 模型。

1.8.0 2021-05-18 06:53 UTC

This package is auto-updated.

Last update: 2024-09-09 14:24:48 UTC


README

Author PHP Version Laravel Version Octane Compatibility Build Status Coverage Status Quality Score Latest Version Software License PSR-12 Total Downloads

SensioLabsInsight

Query Filters 主要是受到了 Laracasts 上的这个课程 的启发,它提供了一种简单的方式来基于 HTTP 请求的查询参数过滤 Eloquent 模型。

安装

通过 Composer

composer require cerbero/query-filters

如果你的 Laravel 版本低于 5.5,可以通过在 config/app.php 文件中添加以下行来注册此包的服务提供者

'providers' => [
    ...
    Cerbero\QueryFilters\Providers\QueryFiltersServiceProvider::class,
]

此包包含一个查询过滤器类的生成器,默认生成在 app/QueryFilters 目录下。如果你希望使用不同的路径,可以在运行后通过在 config/query_filters.php 文件中设置它

php artisan vendor:publish --tag=query_filters_config

使用方法

假设有一个用于索引数据库中存储的所有演员的路由。此路由接受查询参数来过滤记录,例如

/actors?won_oscar&acting=0&acted-in=2000

在这种情况下,路由需要只显示至少获得过一次奥斯卡的演员,他们不再在演艺界,但在 2000 年有过表演。

这可以通过生成一个查询过滤器类并可选地通过以下 Artisan 命令定义允许的查询参数和相关变量名称来实现

php artisan make:query-filters ActorFilters 'won_oscar&acting=bool&acted-in=year'

该命令将生成并填充 ActorFilters 类的过滤器

use Cerbero\QueryFilters\QueryFilters;

/**
 * Filter records based on query parameters.
 *
 */
class ActorFilters extends QueryFilters
{
    /**
     * Filter records based on the query parameter "won_oscar"
     * 
     * @return void
     */
    public function wonOscar()
    {
        // $this->query
    }

    /**
     * Filter records based on the query parameter "acting"
     * 
     * @param mixed $bool
     * @return void
     */
    public function acting($bool)
    {
        // $this->query
    }

    /**
     * Filter records based on the query parameter "acted-in"
     * 
     * @param mixed $year
     * @return void
     */
    public function actedIn($year)
    {
        // $this->query
    }
}

请注意,过滤器名称与相关的查询参数的骆驼峰式形式相同。

只有当查询参数在 HTTP 请求中以非空值存在时,才会应用过滤器,除非它们不需要值来功能(例如 won_oscar)。

$query 属性让过滤器确定应用过滤器时查询如何更改

public function wonOscar()
{
    $this->query->where('oscars', '>', 0);
}

public function acting($bool)
{
    $this->query->where('acting', $bool);
}

public function actedIn($year)
{
    $this->query->whereHas('movies', function ($movies) use ($year) {
        $movies->whereYear('release_date', '=', $year);
    });
}

定义过滤器后,Eloquent 模型可以通过使用 FiltersRecords 特性来应用它们

use Cerbero\QueryFilters\FiltersRecords;
use Illuminate\Database\Eloquent\Model;

class Actor extends Model
{
    use FiltersRecords;
}

最后,在你的路由中,你可以通过调用模型的 filterBy() 方法并传递查询过滤器来过滤演员

use App\Actor;
use App\QueryFilters\ActorFilters;

...

public function index(ActorFilters $filters)
{
    return Actor::filterBy($filters)->get();
}

或者,你可以从纯数组中填充查询过滤器

use App\Actor;
use App\QueryFilters\ActorFilters;
use Illuminate\Http\Request;

...

public function index(Request $request)
{
    $filters = ActorFilters::hydrate($request->query());

    return Actor::filterBy($filters)->get();
}

有时你可能想在不有效时静默跳过过滤器。而不是在 HTTP 请求中设置验证规则,你可以在查询过滤器类中定义它们。

这避免了失败的验证停止过滤过程,并且只应用有效的过滤器,同时忽略验证未通过的值。

class ActorFilters extends QueryFilters
{
    protected function getRules()
    {
        return [
            'acting' => 'bool',
            'acted-in' => 'int|digits:4',
        ];
    }
}

变更日志

请参阅 CHANGELOG 了解最近的变化。

测试

composer test

贡献

请参阅 CONTRIBUTINGCONDUCT 了解详细信息。

安全

如果你发现任何与安全相关的问题,请通过电子邮件 andrea.marco.sartori@gmail.com 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。