putheng / filter
此包最新版本(1.0)的许可证信息不可用。
Laravel 的过滤器包
1.0
2019-01-29 07:08 UTC
Requires
- php: >=7.0
- illuminate/database: >= 5.0
- illuminate/support: >= 5.0
Requires (Dev)
- orchestra/testbench: ~3.7
- phpunit/phpunit: ~7.0
This package is auto-updated.
Last update: 2024-09-29 05:28:12 UTC
README
使用 composer 安装此包。建议仅在开发时使用此包。
composer require putheng/filter
Laravel 5.5 使用包自动发现,因此不需要手动添加 ServiceProvider。
从头开始设置
Laravel 5.5+
如果您不使用自动发现,请将 ServiceProvider 添加到 config/app.php
文件中的 providers 数组
Putheng\Filter\FilterServiceProvider::class,
创建新的 Filter 类
示例:php artisan filter:make CourseFilter
,Filter 类位于 app/Filters
创建新的 Filter 扩展类 php artisan filter:by DifficultyFilter
,Filter 扩展类位于 app/Filters/Filter
将 DifficultyFilter
扩展添加到 DifficultyFilter
类的 $filters
属性中
use App\Filters\Filter\DifficultyFilter; protected $filters = [ 'difficulty' => DifficultyFilter::class, ];
设置 DifficultyFilter
过滤器类
namespace App\Filters\Filter; use Putheng\Filter\FilterAbstract; use Illuminate\Database\Eloquent\Builder; class DifficultyFilter extends FilterAbstract { /** * Mappings for database values. * * Map b on query string map to beginner column on database * * 'b' => 'beginner' * 'beginner' => 'beginner' * * @return array */ public function mappings() { return [ 'b' => 'beginner', 'intermediate' => 'intermediate', 'advanced' => 'advanced', ]; } /** * Filter by course difficulty. * * @param string $access * @return Illuminate\Database\Eloquent\Builder */ public function filter(Builder $builder, $value) { $value = $this->resolveFilterValue($value); if ($value === null) { return $builder; } return $builder->where('difficulty', $value); } }
简单过滤器
将过滤器作用域添加到我们想要过滤的模型中,例如 Course
模型
namespace App; // use filter class we just generated use App\Filters\CourseFilters; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; class Course extends Model { public function scopeFilter(Builder $builder, Request $request, array $filters = []) { return (new CourseFilters($request))->add($filters)->filter($builder); } }
基于关系的过滤
示例:Course
和 Subject
模型,添加多态关系
public function subjects() { return $this->morphToMany(Subject::class, 'subjectable'); }
构建器
return $builder->whereHas('subjects', function (Builder $builder) use ($value) { $builder->where('slug', $value); });
用法
在控制器中使用 Course
模型添加 filter
方法并传递 $request
参数
namespace App\Http\Controllers; use App\Course; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class CourseController extends Controller { public function index(Request $request) { $filter = Course::filter($request)->get(); } }