jasco-b/query-filter

laravel 查询过滤器

1.0.0 2019-09-18 10:34 UTC

This package is auto-updated.

Last update: 2024-09-14 19:36:57 UTC


README

Laravel 查询过滤器可以帮助在搜索时过滤结果。您不需要在搜索时编写if语句或Eloquent构建方法来过滤结果。

安装

您可以通过composer安装此包

composer require jasco-b/query-filter

使用方法

您可以使用以下方式编写您的过滤器

  • 方法
  • 独立类
  • 闭包

方法

use JascoB\QueryFilter\QueryFilter;

class PostFilter extends QueryFilter
{
    protected $filterableFields = ['title'];

    public function title($query, $value)
    {
        $query->orWhere('title', 'like', '%' . $value . '%');
    }

}

独立类

首先,我们需要创建一个独立的类,该类实现IFilterColumn接口或继承抽象类FilterColumn

use JascoB\QueryFilter\Classes\FilterColumn;

class TagFilterColumn extends FilterColumn
{
    public function apply($value)
    {
        return $this->builder->whereHas('tags', function ($query) use ($value) {
            $query->where('name', 'like', '%' . $value . '%');
        });
    }
}
use JascoB\QueryFilter\QueryFilter;

class PostFilter extends QueryFilter
{
    protected $filterableFields = ['title', 'tag'=>TagFilterColumn::class];
    
}

闭包

class PostFilter extends QueryFilter
{
    protected $filterableFields = [];

    public function __construct(Builder $builder)
    {
        parent::__construct($builder);
        $this->initFilters();
    }

    public function initFilters()
    {
        $this->filterableFields['title'] = function ($query, $value) {
            $query->where('title', 'like', "%$value%");
        };
    }
}

模型

在您的模型中必须使用它。

class Post extends Model
{
    public function scopeFilter($query, $request)
    {
        return (new PostFilter($query))->filter($request);
    }

控制器

在您的控制器、服务或仓库中,您可以像这样使用它。

class SearchController extends Controller
{
    public function filter(Request $request)
    {
       $posts =  Post::query()->filter($request->toArray())->get();
    }
}

测试

运行测试: composer test