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);
调用它
我的应用程序支持使用过滤器获取数据。我当前的实现(工作正常)是
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);