putheng/filter

此包最新版本(1.0)的许可证信息不可用。

Laravel 的过滤器包

1.0 2019-01-29 07:08 UTC

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);
    }
}
基于关系的过滤

示例:CourseSubject 模型,添加多态关系

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();
    }
}