因此,我在使用 Laravel 的内置软删除功能时遇到了问题。当我调用 withTrashed()
时,它会返回一个查询生成器对象。这在大多数情况下都很好,但是在我调用它之后我想调用一个像 filter($this->filters)
这样的方法,它是特定于 MODEL 的,现在我无法再访问了我只有一个查询生成器。
反向关系也不起作用,因为 withTrashed()
还需要一个模型,其中我能想到的任何类型的解析方法都会返回模型的查询构建器。
所以我希望找到一种方法来修改带有 where 子句的模型对象,这样我就可以添加我的过滤器并将模型发送到 withTrashed()
并使用适当的过滤器。老实说,我不确定该怎么做。最坏的情况我可以让 filter 方法返回没有任何全局范围的查询生成器,并手动将 withTrashed()
查询添加到末尾。
所以最终的结果应该是这样的:
$model->filter($this->filters)->withTrashed();
我并不是想获得一个庞大的收藏然后将其削减。即使在你有几百万行时使用分块,它也会很快变慢,尤其是当你引入过滤时。从技术上讲,一次性,我可以在调用 ->get()
之前向查询构建器添加多个 ->where()
子句,但这意味着进行自定义过滤每个 Controller 的索引。所以我希望将它抽象为模型中的一种方法,该方法解析发送的过滤器并将它们添加到模型中(这是我不确定的部分。有点像:github.com/marcelgwerder/laravel-api-handler
有什么想法吗?
最佳答案
我相信您正在寻找查询范围。您可以在您的模型上创建一个新的查询范围,然后它可以像任何其他查询构建器方法一样使用。
例如,要创建一个 filter()
作用域:
class MyModel extends Model {
public function scopeFilter($query, $filters) {
// modify $query with your filters
return $query;
}
}
定义了查询范围后,您可以像调用任何其他查询构建器方法一样调用它:
$data = \App\MyModel::withTrashed()->filter(/* your filters */)->get();
您可以阅读更多关于 query scopes here 的信息.
关于php - Laravel 5.2 - 修改模型的构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37008790/