编程

[Laravel 扩展包]Filterable 包:在 Eloquent 模型中使用动态过滤器

195 2024-04-29 00:21:00

Filterable 是 Jerome Thayananthajothy 开发的一个 Laravel 包,它通过可适配、可定制的过滤器和智能缓存增强 Laravel 查询,以提高性能和功能。

这个包打主要特性包括:

  • 动态过滤:基于请求参数使用过滤器。
  • 缓存:通过缓存查询结构提升性能。
  • 用户指定过滤:轻松实现依赖于认证用户的过滤器。
  • 自定义过滤方法:可继承该类添加自己的过滤方法。

定义 Filter 类是这个包的核心,你可以在其中创建可以将过滤应用于 Eloquent 查询的方法。该包内置一个 make:filter Artisan 命令,用于在应用的 App\Filters 命名空间中生成过滤器。以下是包的 README 文件中的过滤器示例:

namespace App\Filters;
 
use Filterable\Filter;
use Illuminate\Database\Eloquent\Builder;
 
class PostFilter extends Filter
{
    protected array $filters = ['status', 'category'];
 
    protected function status(string $value): Builder
    {
        return $this->builder->where('status', $value);
    }
 
    protected function category(int $value): Builder
    {
        return $this->builder->where('category_id', $value);
    }
}

给定一个 PostFilter,你可以在具有 Post 模型的控制器中使用此类来基于 HTTP 查询参数过滤模型:

public function index(Request $request, PostFilter $filter)
{
    // i.e., /posts?status=active&category_id=2
    $query = Post::filter($filter);
 
    $posts = $request->has('paginate')
        ? $query->paginate($request->query('per_page', 20))
        : $query->get();
 
    return response()->json($posts);
}

更多该包详情,请查看 Github 源码