miracuthbert/laravel-eloquent-filters

适用于 Laravel 5.8 及以上版本的优雅过滤器包

1.3.0 2022-01-22 00:25 UTC

This package is auto-updated.

Last update: 2024-09-22 06:56:00 UTC


README

一个用于 Laravel 的包,可用于过滤模型记录。

它如何工作?

简单地说,这个包会检查请求查询中是否存在与模型设置的过滤键对应的键,然后构建查询。

每个模型都有一个相应的 filters 文件,其中可以注册和映射其过滤。

每个注册的 filter 都是一个包含构建查询所需功能的唯一文件。

这意味着对于具有 title 列的模型,它们可以共享相同的过滤文件,从而减少代码重复。

安装

使用 composer 安装此包

composer require miracuthbert/laravel-eloquent-filters

设置

此包利用 Laravel 自动发现,因此无需手动添加 ServiceProvider。

如果您不使用自动发现,请将 ServiceProvider 添加到 config/app.php 中的 providers 数组

Miracuthbert\Filters\EloquentFiltersServiceProvider::class

如果您想发布 config 文件,请在控制台中使用以下命令

发布配置

php artisan vendor:publish --provider=Miracuthbert\Filters\EloquentFiltersServiceProvider --tag=filters-config

用法

设置模型

模型的过滤器通常扩展 Miracuthbert\Filters\FiltersAbstract

它包含应用于模型的过滤器列表以及过滤器列表的 key/value 映射。

要创建一个

首先,使用 php artisan make:model 命令创建一个模型。

然后使用以下命令为模型创建一个过滤器文件

php artisan filter:model {name}

// example
php artisan filter:make UserFilters

// within specific namespace
php artisan filter:make Users\\UserFilters

name 替换为模型名称,最好添加后缀 Filters 以表示它是模型过滤器,例如 UserFilters

将控制台打印出的代码块复制并添加到相关模型中。不要忘记引入所需的命名空间。

在控制器中使用过滤器

设置完成后,在调用模型实例的任何控制器中,调用 filter 范围并传递一个 `Illuminate\Http\Request` 实例。

$users = User::filter($request)->get();

如果您已禁用将过滤器查询附加到分页器,则可以使用 filters_query 辅助函数手动执行此操作

$users->appends(filters_query());
// in blade view
{{ $users->appends(filters_query())->links() }}

创建过滤器

默认情况下,所有创建的过滤器都将放置在 App\Filters 目录(命名空间)内。

要创建过滤器,请使用以下命令

php artisan filter:make {name}

// example
php artisan filter:make NameFilter

// within specific namespace
php artisan filter:make Users\\NameFilter

name 替换为过滤器的名称,例如 NameFilter(普通过滤器)、CreatedOrder(排序过滤器)

在创建过滤器时,最好在名称中添加 FilterOrder 以便于使用。

然后打开过滤器文件并添加您自定义的查询功能。请参阅 filter:make 命令选项以获取一些预设模板。

过滤器基本上是扩展 Illuminate\Database\Eloquent\Builder 的代码块,因此您不受预设模板的限制。

您可以将以下选项传递给 filter:make 命令,以使用一些常见的过滤器模板

  • column - 指示应实现过滤器的列
  • bool - 指示生成的过滤器是否应为布尔过滤器类
  • null - 指示生成的过滤器是否应为空检查过滤器类
  • order - 指示生成的过滤器是否应为排序过滤器类
  • relation - 为给定关系生成过滤器类

将过滤器注册到模型过滤器

创建过滤器后,要使用它,请打开模型过滤器,并在$filters字段下注册一个键/值对。

    /**
     * A list of filters.
     *
     * @var array
     */
    protected $filters = [
         'name' => NameFilter::class,
         'email' => EmailFilter::class,
         'created' => CreatedOrder::class,
    ];

设置默认过滤器

在模型过滤器中,您可以在$defaultFilters字段下注册一个键/值对,用于您想要默认应用的过滤器。

应与在$filters字段上注册的键相同,应为一个实际的数据库值。

注意:默认过滤器仅应用于具有固定不变值的过滤器,例如truefalse

    /**
     * A list of default filters.
     *
     * @var array
     */
    protected $defaultFilters = [
         'created' => 'desc',
    ];

您可以通过在模型过滤器的构造函数中添加不同的检查来覆盖默认过滤器。

    // constructor

    if ($request->hasAny('cancelled', 'completed')) {
        $this->defaultFilters = [
            'upcoming' => 'false'
        ];
    }

控制台命令

包中可用的命令

  • filter:model:为模型创建一个新的过滤器类
  • filter:make:创建一个新的Eloquent过滤器类

传递--help选项到命令以获取更多使用细节

安全漏洞

如果您发现安全漏洞,请通过miracuthbert@gmail.com将电子邮件发送给Cuthbert Mirambo。所有安全漏洞都将得到及时处理。

鸣谢

许可证

该项目是开源软件,根据MIT许可证许可。