【问题标题】:Eager loading with route model binding使用路由模型绑定进行急切加载
【发布时间】:2017-03-17 07:24:22
【问题描述】:

我有这样的控制器功能

public function show(NovelRequest $request, Novel $novel)
{
    // load the chapters
    $novel->chapters;

    // return the detail view of a novel
    return view('novels.show', compact('novel'));
}

我收到一个新对象,因为我正在使用路由模型绑定。但是,我想加载的不仅仅是章节。因为如果我现在做类似的事情会引起很多请求

$novel->chapters;
$novel->bookmarks;
...

我想知道当我已经拥有小说对象时是否有办法加载“多个”关系。通常我会像

Novel::with('chapters', 'bookmarks')-> ...

但是,我已经有了小说对象,所以我不想再查找它了。

【问题讨论】:

    标签: laravel eloquent eager-loading


    【解决方案1】:

    有“Lazy Eager Loading”。 语法为$novel->load('chapters', 'bookmarks');

    【讨论】:

    • 谢谢!正是我需要的
    【解决方案2】:

    我们可以通过在模型上定义resolveRouteBinding 方法来自定义解析逻辑(用于路由模型绑定)渴望加载所需的关系。

    // In the Novel model
    public function resolveRouteBinding($value)
    {
        return $this->with(['chapters', 'bookmarks'])->where($this->getRouteKeyName(), $value)->firstOrFail();
    }
    

    https://laravel.com/docs/6.x/routing#explicit-binding

    【讨论】:

    • 这也是一个很好的解决方案,但是它总是会加载章节和书签,而不仅仅是在我实际需要它们的上下文中
    猜你喜欢
    • 2020-12-16
    • 2013-05-16
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多