gpt4 book ai didi

php - Laravel: `loadMissing` 函数的目的是什么?

转载 作者:可可西里 更新时间:2023-11-01 06:41:44 28 4
gpt4 key购买 nike

Eager Loading section的第一句来自 Laravel 文档的是:

When accessing Eloquent relationships as properties, the relationship data is "lazy loaded". This means the relationship data is not actually loaded until you first access the property.

在本节的最后一段中指出:

To load a relationship only when it has not already been loaded, use the loadMissing method:

public function format(Book $book)
{
$book->loadMissing('author');

return [
'name' => $book->name,
'author' => $book->author->name
];
}

但我看不到 $book->loadMissing('author') 的目的。它在这里做什么?

如果我只删除这一行会有什么不同?根据第一句话,$book->author->name 中的作者无论如何都会延迟加载,对吧?

最佳答案

很好的问题;通过阅读文档并不能立即反射(reflect)出细微的差异。

您正在使用 Lazy Eager Loading 比较“ loadMissing() ”使用 magic properties 进行“延迟加载”在模型上。

顾名思义,唯一的区别是:

  • “延迟加载”仅在关系使用时发生。
  • “Eager lazy loading”可以在使用之前发生。

因此,实际上,除非您想在使用关系之前显式加载关系,否则没有区别。

同样值得注意的是 loadloadMissing方法让您有机会通过传递一个闭包来自定义关系加载逻辑,这在使用魔术属性时不是一个选项。

$book->loadMissing(['author' => function (Builder $query) {
$query->where('approved', true);
}]);

这转化为“如果尚未加载,则加载缺少的已批准作者”,这是使用$book->author 无法实现的除非你定义一个 approvedAuthor模型上的关系(不过这是一种更好的做法)。


直接回答您的问题;是的,如果你删除不会有任何区别:

$book->loadMissing('author'); 

在那个特定的例子中,因为它是在加载后立即使用的。但是,可能很少有人希望在使用关系之前加载关系。


因此,概述关系加载方法的工作原理:

预加载

通过使用 with() 您可以在查询父模型时“预先加载”关系:

$book = Book::with('author')->find($id);

延迟加载

父模型已经被检索到之后急切加载一个关系:

$book->load('author');

它也可以用于仅急切加载缺失的方式:

$book->loadMissing('author');

load() 相反方法, loadMissing() 方法过滤给定的关系并延迟“急于”加载它们仅当尚未加载时

通过接受闭包,这两种方法都支持自定义关系加载逻辑。

延迟加载

通过使用 magic properties 发生的延迟加载, 是为了开发人员的方便。它在使用时加载关系,因此您不需要事先加载它。


@rzb 在 his answer 中提到了一个很好的观点以及。看看。

关于php - Laravel: `loadMissing` 函数的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com