Php Laravel 5.2-修改模型';s建筑商

Php Laravel 5.2-修改模型';s建筑商,php,laravel,model,eloquent,Php,Laravel,Model,Eloquent,所以,我正在使用Laravel内置的软删除,我遇到了一个问题。当我调用withTrashed()时,它返回一个查询生成器对象。在大多数情况下,这很好,但是在我调用它之后,我想调用一个类似于filter($This->filters)的方法,它是特定于模型的,现在我已经没有访问权限了,因为我只有一个查询生成器 反向关系也不起作用,因为withTrashed()还需要一个模型,在这个模型中,我能想到的任何类型的解析方法都会返回模型的查询生成器 因此,我希望找到一种方法,用where子句修改模型对象,

所以,我正在使用Laravel内置的软删除,我遇到了一个问题。当我调用
withTrashed()
时,它返回一个查询生成器对象。在大多数情况下,这很好,但是在我调用它之后,我想调用一个类似于
filter($This->filters)
的方法,它是特定于模型的,现在我已经没有访问权限了,因为我只有一个查询生成器

反向关系也不起作用,因为
withTrashed()
还需要一个模型,在这个模型中,我能想到的任何类型的解析方法都会返回模型的查询生成器

因此,我希望找到一种方法,用where子句修改模型对象,这样我就可以添加过滤器,并在过滤器就位的情况下将模型发送到
withTrashed()
。我真的不知道该怎么做。最坏情况下,我可以让filter方法返回查询生成器,而不使用任何全局作用域,并手动将
withTrashed()
query on添加到末尾

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

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

我不想得到一个巨大的收集和削减它。即使在有几百万行的情况下进行分块,它也会变得很慢很快,特别是当你引入过滤时。从技术上讲,对于一次性操作,我可以在调用
->get()
之前向查询生成器添加多个
->where()
子句,但这意味着在每个控制器的索引中执行自定义筛选。因此,我希望将其抽象为模型中的一种方法,解析发送进来的过滤器并将其添加到模型中(这是我不确定的部分,类似于:github.com/marcelgwerder/laravel-api-handler)


有什么想法吗?

过滤器是一种收集方法,如您在这里所见

要使它返回一个集合,您应该使用像get()这样的方法,正如您在这里看到的

在此之后,您将能够在$yourVar!中进行筛选!或者使用where()方法获得查询筛选的集合

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

在这两种方法中,$yourVar都是get()方法返回的结果的集合。我相信您正在寻找查询范围。您可以在模型上创建一个新的查询范围,然后它可以像任何其他查询生成器方法一样使用

例如,要创建
过滤器()
作用域:

class MyModel extends Model {
    public function scopeFilter($query, $filters) {
        // modify $query with your filters

        return $query;
    }
}
定义了该查询范围后,可以像调用任何其他查询生成器方法一样调用它:

$data = \App\MyModel::withTrashed()->filter(/* your filters */)->get();

您可以阅读更多信息。

不知道是否已经存在此问题,但我想我找到了一种解决方法

软删除实际上是一个全局范围

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

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

在文档链接中,有一个关于如何操作的示例,以及来自Laravel creator的更多解释

希望对大家有所帮助

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


我现在明白了,这已经有了一个解决方案,但也许这种方法对你更好,或者对其他人更好,无论如何,这只是另一种方法!

->filter()
对集合有效,因此它们只有在执行查询后才有用。你能不能不添加
->where()
链接到
withTrashed
调用的条件,如示例中所示?该条件应在执行查询之前运行,这样更好。如果我不清楚,我道歉。我想构建一个自定义筛选器()方法。我不打算使用集合筛选器方法或任何其他集合方法。此外,我正在尝试抽象出此功能,以便不必在调用整个apiI中多个对象的每个端点上定义自定义where子句。我提到了
filter()
但没有指定我实际上试图在我的基础模型上创建一个自定义筛选方法,该方法将通过请求中的筛选器进行解析,并将适当的where/wherehas筛选器添加到模型的查询生成器中。我没有尝试使用
筛选器()
收集提供的方法,因为我的数据集太大可能你已经知道了,但你可以使用chunk方法部分处理你的数据。如果这仍然没有帮助,我想我不太明白你需要什么帮助,你太普通了!哼,对不起,兄弟,现在我得到了你需要的,但我不知道如何帮助你th this:(非常有效,谢谢!
$data = \App\MyModel::withTrashed()->filter(/* your filters */)->get();