Eloquent 型号的自定义过滤

Custom filtering on Eloquent model

我的应用程序支持使用过滤器获取数据。我当前的实现(工作正常)是

Model::select($fields)->with($relations)->tap(function ($query) use ($filters) {
  // A lot of filtering logic here
  // $query->where()...... 
})->get();

但是,我想将过滤逻辑直接移动到模型中,这样我就可以做到

Model::select($fields)
  ->with($relations)
  ->applyFilters($filters)
  ->get();

我曾尝试将 filter 方法添加到 Model,但那时我正在使用 Builder,但它无法识别我的函数:

Call to undefined method Illuminate\Database\Eloquent\Builder::applyFilters()

除了创建新构建器 class 并使用它之外,还有更简单的方法吗?

我想通了!我只需要在我的 Model class 中添加一个 scopeApplyFilters。它自动将 Builder 作为第一个参数注入,因此逻辑最终看起来像

public function scopeApplyFilters($query, $filters)
{
    // Perform filtering logic with $query->where(...);

    return $query;
}

然后我可以用Model::applyFilters($filters);

调用它