Laravel 5.2 - 修改模型的构建器

时间:2016-05-03 15:52:17

标签: php laravel model eloquent

所以,我正在使用Laravel内置的软删除功能,而且我遇到了一个问题。当我调用withTrashed()时,它返回一个查询构建器对象。这对于大多数情况都没问题但是在我调用之后我想调用一个特定于MODEL的filter($this->filters)方法,我现在不再有权访问我只有一个查询构建器。

反向关系也不起作用,因为withTrashed()也想要一个模型,我能想到的任何类型的解析方法都会返回模型的查询构建器。

所以我希望找到一种方法来修改带有where子句的模型对象,这样我就可以添加我的过滤器并将模型发送到withTrashed()并使用过滤器。我老实说不知道怎么做。最糟糕的情况我可以让filter方法返回没有任何全局范围的查询构建器,并手动将withTrashed()查询添加到最后。

所以最终的结果是这样的:

$model->filter($this->filters)->withTrashed();

我不是想要收集一个巨大的收藏品并将其缩小。即使你有几百万行的分块,它也会很快变慢,特别是当你引入过滤时。从技术上讲,对于一次性,我可以在调用->where()之前向查询构建器添加多个->get()子句,但这意味着在每个控制器的索引中进行自定义过滤。所以我希望将它抽象为模型中的一种方法来解析发送的过滤器并将它们添加到模型中(这是我不确定的部分。有点像:github.com/marcelgwerder/laravel-api-handler < / p>

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我相信您正在寻找查询范围。您可以在模型上创建新的查询范围,然后可以像使用任何其他查询构建器方法一样使用它。

例如,要创建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的更多信息。

答案 1 :(得分:0)

过滤器是一种集合方法,您可以在此处看到https://laravel.com/docs/5.2/collections#method-filter

要使其返回一个集合,你应该使用像get()这样的方法,正如你在这里看到的那样https://laravel.com/docs/5.2/eloquent#querying-soft-deleted-models

$yourVar = \App\YourModel::withTrashed()->get();

之后你可以在$ yourVar中过滤掉!或者使用where()方法来获取由查询过滤的集合

 $yourVar = \App\YourModel::withTrashed()->where('active = 1')->get();

在两者中,$ yourVar将是get()方法

返回的结果集合

答案 2 :(得分:0)

不知道是否已经有这个问题,但我认为我找到了一种方法。使用Eloquent的全球范围(https://laravel.com/docs/5.2/eloquent#global-scopes

软删除实际上是全局范围。

您将为Scope类创建一个实现,然后您将创建一个将执行where子句的apply方法。

最后在您的模型中,您将覆盖引导方法,表示此模型使用此全局范围,此模型中的每个查询都将以这种方式执行。

在文档链接中有一个例子,说明如何以及Laravel创建者的更多解释。

希望有这个帮助!

--------编辑--------

我现在已经看到已经有了一个解决方案,但也许这种方式可能对您有好处,或者对其他方式更好,无论如何,只是另一种方法!