netsells / eloquent-filters
一个简单的包,帮助您轻松组织模型查询逻辑
2.0.0
2020-11-25 16:02 UTC
Requires
- php: ^8.0
- netsells/attribute-finder: ^2.0
Requires (Dev)
- orchestra/testbench: ^6.4
This package is auto-updated.
Last update: 2024-08-27 19:21:27 UTC
README
Eloquent Filters为您提供了易于组织和添加过滤器到Eloquent模型的框架。此包的主要目的是通过帮助您将搜索/过滤逻辑提取到定义良好、专门的类中来帮助保持模型和控制器整洁。
由Netsells团队创建和维护
主要功能
- 设置非常简单。发布一个配置文件,然后将一个特质应用到您的模型上,您就完成了。
- 为您提供了一种替代方案,以避免在模型中填充大量作用域或在控制器中填充大量查询逻辑。
- 为在多个模型之间重复使用过滤逻辑提供基础。
安装
使用composer
composer require netsells/eloquent-filters
然后使用以下Artisan命令发布配置文件
php artisan vendor:publish --tag=eloquent-filters
用法
基本用法
一旦发布配置,将Netsells\EloquentFilters\Traits\HasFilters特质添加到您希望添加过滤器的任何模型中。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFilters; }
接下来创建一个实现Netsells\EloquentFilters\Interfaces\FilterInterface;的过滤器类。
<?php namespace App\Features\Filters; use Illuminate\Database\Eloquent\Builder; use Netsells\EloquentFilters\Interfaces\FilterInterface; class TitleFilter implements FilterInterface { public function applyFilter(Builder $query, $value): void { $query->where('title', 'like', "%{$value}%"); } }
注册过滤器
注册过滤器有两种方式。首先,在下面的eloquent-filters.php配置文件中的filters数组中
/* |-------------------------------------------------------------------------- | Model Filter Registration |-------------------------------------------------------------------------- | This config file is used to register eloquent filters against | a query parameter. | | Model::class => [ | 'query_parameter' => Filter::class, | ], | */ 'filters' => [ Post::class => [ 'title' => TitleFilter::class, ], ],
或者通过将Netsells\EloquentFilters\Attributes\FiltersModel属性应用到过滤器类上。该属性接受两个参数,这两个参数是过滤器要绑定到的模型类和查询参数。
<?php namespace App\Features\Filters; use Illuminate\Database\Eloquent\Builder; use Netsells\EloquentFilters\Interfaces\FilterInterface; use Netsells\EloquentFilters\Attributes\FiltersModel; #[FiltersModel(Post::class, 'title')] class TitleFilter implements FilterInterface { public function applyFilter(Builder $query, $value): void { $query->where('title', 'like', "%{$value}%"); } }
您可以通过在eloquent-filters.php配置文件中设置filter_directory值来指定查找过滤器所在的目录。默认情况下,将扫描整个app/目录。
注意 - 查询参数独立于所查询的数据库列。
最后,按照以下方式应用过滤器。
Route::get('/', function () { return Post::applyFilters([ 'title' => 'Laravel' ])->get(); });
您可以将任何iterable传递给applyFilters()方法。因此,以下所有内容也都是有效的
Route::get('/', function (Request $request) { return Post::applyFilters($request->all())->get(); });
Route::get('/', function (Request $request) { return Post::applyFilters($request->validated())->get(); });
Route::get('/', function (Request $request) { return Post::applyFilters($request->only('title'))->get(); });
Route::get('/', function (Request $request) { $collection = collect(['title' => 'laravel']); return Post::applyFilters($collection)->get(); });