touhidurabir/laravel-filterable

一个基于查询参数或检索到的模型集合过滤Laravel模型的包

1.0.0 2021-09-16 06:48 UTC

This package is auto-updated.

Last update: 2024-09-16 13:18:32 UTC


README

一个基于查询参数或检索到的模型集合过滤Laravel模型的包。

安装

使用composer安装/要求该包

composer require touhidurabir/laravel-filterable

发布配置文件

php artisan vendor:publish --provider="Touhidurabir\Filterable\FilterableServiceProvider" --tag=config

配置

该包附带一个名为filterable的配置文件,其中包含2个重要的配置

基础过滤器类

这是一个数组,包含查询和集合过滤器的基础类,如下

'base_class' => [
    'query'         => \Touhidurabir\Filterable\Bases\BaseQueryFilter::class,
    'collection'    => \Touhidurabir\Filterable\Bases\BaseCollectionFilter::class,
],

如果需要进一步扩展以添加更多功能或任何自定义功能,可以在配置文件中设置基础类。

过滤器类命名空间

此配置定义了查询和集合过滤器类的默认命名空间(以及存储路径),如下

'filterable_namespace' => [
    'query'         => 'App\\QueryFilters',
    'collection'    => 'App\\CollectionFilters',
],

如果需要,可以从那里更改默认路径。但是,也可以通过向过滤器生成命令传递不同的命名空间来提供不同的命名空间。

命令

该包包含一个方便的命令来生成过滤器类,如下

php artisan make:filter User

它将根据配置文件中定义的命名空间生成两个类UserQueryFilterUserCollectionFilter

此命令还包括几个方便的选项,以使过滤器类生成尽可能灵活,例如

--filters=

通过传递逗号分隔的过滤器,它将在查询和集合过滤器类中将其作为可过滤方法添加

php artisan make:filter User --filter=name,email

对于查询过滤器

public function name($value) {

    // return $this->builder->;
}

public function email($value) {

    // return $this->builder->;
}

对于集合过滤器

public function name($item, $value) {

}

public function email($item, $value) {

}

--query-suffix=QueryFilter

定义查询过滤器类文件名和类名后缀。

--collection-suffix=CollectionFilter

定义集合过滤器类文件名和类名后缀。

--no-suffix

如果作为开关选项或标志传递,则不会向查询或集合过滤器类名称或文件名称添加后缀。

--only-query

如果作为开关选项或标志传递,则仅生成查询过滤器并省略集合过滤器类。

--only-collection

如果作为开关选项或标志传递,则仅生成集合过滤器并省略查询过滤器类。

--replace

如果作为开关选项或标志传递,则将替换现有文件。默认情况下,如果给定文件已经存在,则不会替换它。

用法

生成过滤器

php artisan make:filter User --filter=name,email

它将在给定的路径生成UserQueryFilter.phpUserCollectionFilter.php

<?php

namespace App\QueryFilters;

use Touhidurabir\Filterable\Bases\BaseQueryFilter;
use Illuminate\Database\Eloquent\Builder;

class UserQueryFilter extends BaseQueryFilter {

    /**
     * Retrieve the rules to validate filters value.
     * If a filter validation fails, the filter is not applied.
     *
     * @return array
     */
    protected function getRules() {
        
        return [];
    }

	
    /**
     * Filter by request param name
     *
     * @param  mixed $value
     * @return object<\Illuminate\Database\Eloquent\Builder>
     */
    public function name($value) {

        // return $this->builder->;
    }


    /**
     * Filter by request param email
     *
     * @param  mixed $value
     * @return object<\Illuminate\Database\Eloquent\Builder>
     */
    public function email($value) {

        // return $this->builder->;
    }


}
<?php

namespace App\CollectionFilters;

use Throwable;
use Touhidurabir\Filterable\Bases\BaseCollectionFilter;
use Illuminate\Support\Collection;

class UserCollectionFilter extends BaseCollectionFilter {

    /**
     * Retrieve the rules to validate filters value.
     * If a filter validation fails, the filter is not applied.
     *
     * @return array
     */
    protected function getRules() {
        
        return [];
    }

    
    /**
     * Filter by name
     *
     * @param  object $item
     * @param  mixed  $value
     *
     * @return
     */
    public function name($item, $value) {
        
        // return
    }


    /**
     * Filter by email
     *
     * @param  object $item
     * @param  mixed  $value
     *
     * @return
     */
    public function email($item, $value) {

        // return
    }
}

并在模型中使用Filterable特质

use Touhidurabir\Filterable\Filterable;

class User extends Model {

    use Filterable;
}

在某些控制器中,可以这样使用

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\QueryFilters\UserQueryFilters;
use App\CollectionFilter\UserCollectionFilter;

class UserController extends Controller {

    public function index(Request $request) {

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

        // or filter a collection as 

        $users = (new UserCollectionFilter)->filter(User::all(), ['email', 'name']);

        // of pass $request in constructor for collection filter

        $users = (new UserCollectionFilter($request))->filter(User::all());
    }
}

也可以使用现有的数组作为查询传递给过滤器类

UserQueryFilter::hydrate([]);
UserCollection::applyFilter(User::all() ,[]);

请注意,如果不传递,则不需要传递请求,因为它将解析请求外观。对于应用程序运行在Laravel Octane的情况非常有用。

它还可以处理过滤器参数验证

protected function getRules() {
    
    return [];
}

在那里设置验证规则,并且那些未通过验证的参数将不会应用。

为什么要有集合过滤器?

为什么一个集合过滤器像查询过滤器一样大多数情况下是足够的,这是一个合理的疑问。但有时候,在从数据库中检索记录之后,使用集合过滤器进行一些自定义过滤可能会很有帮助。因为这个包允许生成单独的集合过滤器,在这种情况下,它对这样的目的可能会有所帮助。

贡献

欢迎提交拉取请求。对于重大变更,请先创建一个问题来讨论您想进行哪些更改。

请确保根据需要更新测试。

许可证

MIT