【问题标题】:Laravel Eloquent query builder no relation on wrapped 'where'Laravel Eloquent 查询构建器与包装的“where”没有关系
【发布时间】:2020-12-10 15:58:23
【问题描述】:

我创建了一个 package for searching models with JSON input,它在 Eloquent 模型上公开了一个 search 宏。

在尝试包装查询时,我注意到一个奇怪的行为,所以我想知道我是否做错了什么。

例如,像这样加载关系:

Builder::macro('search', function () {
    return $this->with('someRelation');
});

结果是所有模型都加载了它们的关系,看起来都很好。

将其包装在额外的 where 子句中会导致它仅加载模型而不加载任何关系:

Builder::macro('search', function (array $input) {
    return $this->where(function (Builder $builder) {
        $builder->with('someRelation');
    });
});

为什么这不起作用?如何在包裹在外部where 中时使其加载关系?

【问题讨论】:

    标签: php laravel eloquent query-builder laravel-7


    【解决方案1】:

    我无法解释为什么它不起作用的细节,但我想以下两个选项之一可以解决它:

    Builder::macro('search', function (array $input) {
        return $this->where(function (Builder $builder) {
            return $builder->with('someRelation'); // note added 'return'
        });
    });
    

    Builder::macro('search', function (array $input) {
        return $this->where(function (Builder $builder) {
            // return whatever
        })->with('someRelation');
    });
    

    【讨论】:

    • 我已经尝试退货了,它没有任何作用。在原始 Builder 对象 ($this) 上链接 with() 有效,但它没有包含在 where() 中......那么它与我的第一个示例相同
    • 请问你为什么要使用where函数?如果您只想要关系,那么它似乎没有必要,除非您想指定其他条件。我认为with() 必须与where() 处于同一水平才能工作
    • 这是我正在做的一个小小的逻辑摘录,它并不像看起来那么简单。我需要将它包装在 where() 中,因为如果我做一个内部 orWhere() 我打开我的应用程序到安全漏洞。
    • 我仍然不确定我为什么需要在 where() 中使用 with()。如果您试图只为您正在检索的模型的特定实例急切加载关系,那么请看这里,laravel.com/docs/7.x/…
    • 我很确定我知道预加载的工作原理,谢谢 :D不是我为什么需要它,而是为什么它不起作用。
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2021-05-25
    • 2019-12-09
    • 2015-07-05
    • 1970-01-01
    • 2020-03-19
    • 2013-10-03
    • 2017-07-19
    相关资源
    最近更新 更多