tiagomichaelsousa/laravelfilters

Laravel Filters 是一个允许以简洁方式过滤 Eloquent 模型的包。

v1.6.0 2024-09-03 15:49 UTC

This package is auto-updated.

Last update: 2024-09-03 15:50:40 UTC


README

Laravel Filters

Packagist Version Packagist Downloads Build Status Style Status Licence All Contributors Code Quality Code Coverage

Laravel Filters 是一个基于 Laracasts 视频制作的包,由 JeffreyWay 创建。这个包允许以简洁、简单的方式过滤 Eloquent 模型。

安装

  1. 使用 Composer 安装此包

    $ composer require tiagomichaelsousa/laravelfilters

    该包将自动注册其服务提供者。

  2. 可选:如果想要更改任何默认值,请发布配置文件

    php artisan vendor:publish --provider="tiagomichaelsousa\LaravelFilters\LaravelFiltersServiceProvider" --tag="config"

使用方法

创建过滤器

$ php artisan make:filter <name>

此命令将在配置文件上定义的命名空间中创建一个新的过滤器类。

更新你的 Eloquent 模型

你的模型应该使用 Filterable 特性,它有两个作用域 filter()resolve()

use tiagomichaelsousa\LaravelFilters\Traits\Filterable;

class User extends Authenticatable
{
    use Filterable;
}

filter() 方法接收查询构建器和负责过滤方法的类实例。

resolve() 方法像是一个助手。它检查请求是否有查询字符串 paginate=x,如果有,则返回带有分页的响应,否则返回数据。

创建你的过滤器

当你向端点发出请求时,QueryFilter 类(它扩展了 UserFilters)会检查是否有与请求查询字符串中发送的名称相同的方法。

php artisan make:filter <name> 带有一个默认的搜索方法,如果你想要,可以删除它。当你向 /api/users?search=Foobar 发出请求时,QueryFilter 类会调用搜索方法,因为键 search 同时存在于请求和 UserFilters 类中。

use tiagomichaelsousa\LaravelFilters\QueryFilters;

class UserFilters extends QueryFilters
{
    /**
     * Search all.
     *
     * @param  string  $query
     * @return Builder
     */
    public function search($value = '')
    {
        return $this->builder->where('name', 'like', '%' . $value . '%');
    }
}

搜索方法将对构建器实例应用查询。换句话说,你可以组合多个子句。例如,如果你想对数据库中的 namelast_name 字段进行搜索,只需添加 orWhere 子句。

/**
 * Search all.
 *
 * @param  string  $query
 * @return Builder
 */
public function search($value = '')
{
    return $this->builder
                ->where('name', 'like', '%' . $value . '%')
                ->orWhere('last_name', 'like', '%' . $value . '%');
}

如果你想添加更多过滤器,只需向类中添加一个新方法,添加过滤逻辑,并通过请求查询字符串发送它。

你还可以通过 Eloquent 关联来过滤数据。例如,通过 /api/users?country=PT 过滤来自特定国家的用户

/**
 * Filter by country.
 *
 * @param  string $country
 * @return Builder
 */
public function country($country)
    {
    return $this->builder->whereHas('address', function ($query) use ($country) {
        $query->where('country_code', $country);
    });
}

更新你的控制器

class UserControllerAPI extends Controller
{
    /**
     * Display a listing of the users.
     *
     * @param  \App\Filters\UserFilters  $filters
     * @return \App\Http\Resources\Collections\UserCollection
     */
    public function index(UserFilters $filters)
    {
        $users = User::filter($filters)->resolve();

        return new UserCollection($users);
    }

filter() 方法可以在使用 Filterable 特性的任何模型实例中调用。所以假设你有一个模型 Meeting,这个 Meeting 有很多用户。你可以这样过滤 Meeting 的用户

class MeetingUsersControllerAPI extends Controller
{
    /**
     * Display a listing of the users from a meeting.
     *
     * @param  \App\Filters\UserFilters  $filters
     * @return \App\Http\Resources\Collections\UserCollection
     */
    public function index(Meeting $meeting, UserFilters $filters)
    {
        $users = $meeting->users()->filter($filters)->resolve();

        return new UserCollection($users);
    }

也可以通过传递关联数组来实例化过滤器

$users = User::filter(new UserFilters(['search' => 'john']))->resolve();

变更日志

请参阅 changelog 以获取最近更改的更多信息。

测试

$ composer test

带有测试覆盖率

$ composer test-report

贡献

请参阅 contributing.md 以获取详细信息和一个待办事项列表。

安全性

如果你发现任何与安全相关的问题,请通过电子邮件 作者 而不是使用问题跟踪器。

鸣谢

许可协议

许可协议 MIT。请参阅许可文件获取更多信息。

行为准则

请参阅行为准则获取更多信息。

贡献者 ✨

感谢这些出色的人们 (表情符号键)

此项目遵循all-contributors规范。欢迎任何形式的贡献!