php - Laravel 5.2 - 修改模型的构建器

标签 php laravel model eloquent

因此,我在使用 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/

相关文章:

php - Laravel 5.4 - 使用正则表达式进行验证

python - 如何创建可以使用代码解锁的页面

php - 无法让php更新mysql

javascript - 将 nodsjs 集成为 WordPress 中的嵌入式网站

mysql - Laravel/Lumen 中的自定义时区支持

c++ - Qt 表模型列覆盖

r - R lme 中对象中的缺失值

php - FedEx express API。运输标签。多件包裹运输

java - 使用JAVA编写的自定义算法加密网页字段

css - laravel mix 中的自动前缀