huang-yi/laravel-filter

Laravel 查询过滤器

1.0.0 2018-07-24 04:07 UTC

This package is auto-updated.

Last update: 2024-09-12 21:31:24 UTC


README

此包帮助开发者构建查询过滤器。

翻译

中文文档

安装

可以通过 composer 安装此包。

composer require huang-yi/laravel-filter

注册服务提供者(可选)

如果你的 Laravel 版本小于 5.5,你需要手动注册服务提供者。

<?php // File: config/app.php

return [
    'providers' => [
        HuangYi\Filter\FilterServiceProvider::class,
    ],
];

配置(可选)

运行此命令以发布配置文件

$ php artisan vendor:publish --provider="HuangYi\Filter\FilterServiceProvider"

key:从查询字符串中获取过滤规则的关键字。

log_level:日志级别。

parser:过滤规则解析器。

生成过滤器

要创建新的过滤器,请使用 make:filter Artisan 命令。此命令将在 app/Filters 目录中创建一个新的过滤器类,并在 app/filters.php 文件中命名过滤器。

php artisan make:filter user.gender
<?php // File: app/Filters/User/Gender.php

namespace App\Filters\User;

use HuangYi\Filter\Contracts\FilterContract;
use Illuminate\Database\Eloquent\Builder;

class Gender implements FilterContract
{
    /**
     * Apply filter to eloquent builder.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param mixed $value
     * @return void
     */
    public function apply(Builder $query, $value)
    {
        $query->where('gender', $value);
    }
}
<?php // File: app/filters.php

use HuangYi\Filter\Facades\Filter;

Filter::name('user.gender', App\Filters\User\Gender::class);

使用过滤器

此包提供了一个 trait HuangYi\Filter\HasFilter

<?php

namespace App\Http\Controllers;

use App\User;
use HuangYi\Filter\HasFilter;

class UserController extends Controller
{
    use HasFilter;

    /**
     * User list.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function index()
    {
        $query = User::query();

        $this->applyFilters($query);

        $users = $query->get();

        return $users;
    }
}

客户端查询

我们应该将期望的过滤器 JSON 表示编码为 Base 64,并将其放入 filters 查询字符串变量中。

let Base64 = require('js-base64').Base64;
let axios = require('axios');

let filters = JSON.stringify([
    {
        name: "user.gender",
        value: "female"
    },
    {
        name: "user.cities",
        value: [1, 2, 3]
    }
]);

filters = Base64.encode(filters);

axios.get('/users', {
    filters: filters
}).then((response) => {
    console.log(response);
});

许可证

Laravel Filter 依据 MIT 许可证 (MIT) 许可。