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