davidoc26/eloquent-filter

构建查询的简单过滤器系统

v2.3.0 2023-03-25 07:02 UTC

This package is auto-updated.

Last update: 2024-09-25 10:20:59 UTC


README

构建查询的简单过滤器系统

Latest Stable Version Total Downloads License PHP Version Require

要求

  • PHP 8.0+
  • Laravel 8, 9, 10

安装

composer require davidoc26/eloquent-filter

介绍

过滤器允许您对查询应用限制/规则。就像中间件。

有两种类型的过滤器

  1. 过滤器
  2. RequestFilter(提供对Request实例的访问)

过滤器也可以 具有自己的参数(使用HasArguments特质)

用法

使用Filterable

要开始使用过滤器,您需要在您的模型上使用 Filterable 特质。

use Davidoc26\EloquentFilter\Traits\Filterable;

class Post extends Model
{
    use Filterable;
}

要定义过滤器,覆盖您模型中的 getFilters() 方法并返回过滤器。如果没有定义过滤器,则不会执行过滤。

public function getFilters(): array
{
    return [
        FirstFilter::class,
        SecondFilter::class => ['argument' => 20], // As mentioned above, filters can have their own arguments.
    ];
}

创建新的过滤器

要创建一个基本过滤器,请使用以下命令:

php artisan make:filter MyFilter

此命令将在 app/Filters 目录中创建一个过滤器。

use Davidoc26\EloquentFilter\Filters\Filter;

class MyFilter extends Filter
{
    public function filter(Builder $builder, Closure $next): Builder
    {
        //

        return $next($builder);
    }
}

创建新的RequestFilter

如果您需要一个具有Request实例的过滤器,请创建一个RequestFilter

php artisan make:request-filter MyRequestFilter

use Davidoc26\EloquentFilter\Filters\RequestFilter;

class MyRequestFilter extends RequestFilter
{
    public function filter(Builder $builder, Closure $next): Builder
    {
        // $this->request

        return $next($builder);
    }
}

过滤器参数

如果您希望您的过滤器具有参数(例如默认值),请在您的过滤器上使用 HasArguments 特质

要设置参数,在您的模型的 getFilters() 方法中指定它们

public function getFilters(): array
{
    return [
        LimitFilter::class => ['limit' => 10], // For convenience, specify the arguments in an array.
    ];
}

然后,您可以在过滤器中使用动态属性来获取您的参数

use Davidoc26\EloquentFilter\Filters\RequestFilter;
use Davidoc26\EloquentFilter\Traits\HasArguments;

class LimitFilter extends RequestFilter
{
    use HasArguments;

    public function filter(Builder $builder, Closure $next): Builder
    {
        // If there is no limit in the request, we use the limit specified in the model.
        $builder->when(
            $this->request->input('limit', $this->limit),
            fn(Builder $builder, $limit) => $builder->limit($limit)
        );
        
        // Note that you must always return this.
        return $next($builder);
    }
}

要查看您在模型中定义的所有参数,请使用 getArguments() 过滤器方法

过滤器包

过滤器包允许您将多个过滤器收集在一个包中。过滤器包的主要目的是将相同的过滤器应用于模型。

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

php artisan make:filter-pack MyFilterPack

它将在 app/Filters/Packs 目录中创建过滤器包

<?php

namespace App\Filters\Packs;

use Davidoc26\EloquentFilter\Packs\FilterPack;

class MyFilterPack extends FilterPack
{
    public function getFilters(): array
    {
        return [
            // Define your filters here.
        ];
    }
}

然后您可以将过滤器包应用于您的模型

Post::withFilterPacks([MyFilterPack::class])->get();
// The meaning of the filter pack is that you can use it on any model that uses the Filterable trait
User::withFilterPacks([
    MyFilterPack::class, 
    SecondFilterPack::class,
])->get();

应用过滤器

要应用 getFilters() 方法中指定的过滤器,请在您的模型上使用 filter()

Post::filter()->get(); 
// You can also pass additional filters:
Post::filter([OrderByFilter::class])->get();

要仅使用您需要的过滤器,请使用 withFilters() 方法并将其传递到其中,此方法将忽略您在模型中指定的过滤器

Post::withFilters([
    LoadRelationshipFilter::class,
    OffsetFilter::class
])->get();