使用路由模型绑定进行急切加载

Posted

技术标签:

【中文标题】使用路由模型绑定进行急切加载【英文标题】: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')-> ...

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

【问题讨论】:

【参考方案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

【讨论】:

这也是一个很好的解决方案,但是它总是会加载章节和书签,而不仅仅是在我实际需要它们的上下文中

以上是关于使用路由模型绑定进行急切加载的主要内容,如果未能解决你的问题,请参考以下文章

laravel 路由模型绑定

Laravel - 使用 json 字段自定义路由模型绑定中的键

Laravel 路由模型绑定 - Laravel 5.7

没有路由器的角度延迟加载模块

在路由加载时将模型加载到 redux 存储的最佳方法

Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定