laravel with() 方法与 load() 方法

2023-12-01

我真的很努力去理解两者之间的区别with()方法和load()方法,但没能真正理解。

据我所知,使用with()方法“更好”,因为我渴望加载关系。看来如果我使用load()我加载关系就像使用hasMany()(或与对象之间的关系相关的任何其他方法)。

我理解错了吗?


两者都实现了相同的最终结果——渴望将相关模型加载到第一个模型上。事实上,它们都运行完全相同的两个查询。关键的区别在于with()eager 在初始查询之后立即加载相关模型(all(), first(), or find(x), 例如);使用时load(),您首先运行初始查询,然后在稍后的某个时刻立即加载关系。

这里的“渴望”意味着我们将特定结果集的所有相关模型关联起来仅使用一个查询,而不是必须跑步n查询,其中n是初始集合中的项目数。


使用预加载with()

如果我们急于加载使用with(), 例如:

$users = User::with('comments')->get(); 

...如果我们有 5 个用户,则立即运行以下两个查询:

select * from `users`
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)

...我们最终得到了一个模型集合,其中的注释附加到用户模型上,所以我们可以做类似的事情$users->comments->first()->body.


使用“惰性”急切加载load()

或者,我们可以首先获取初始结果来分离两个查询:

$users = User::all();

它运行:

select * from `users`

之后,如果我们决定需要所有这些用户的相关评论,我们可以在事后立即加载它们:

$users = $users->load('comments');

它运行第二个查询:

select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5)

...我们最终得到相同的结果,只是分为两个步骤。再次,我们可以调用$users->comments->first()->body获取任何项目的相关模型。


Why use load() vs. with()? load()使您可以选择稍后根据某些动态条件决定是否需要运行第二个查询。但是,如果毫无疑问您需要访问所有相关项目,请使用with().


其中任何一个的替代方法是循环遍历初始结果集并查询hasMany()每个项目的关系。这最终会运行n+1查询,或6在这个例子中。预加载,无论是否预先完成with()或稍后与load(),仅运行2查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

laravel with() 方法与 load() 方法 的相关文章

随机推荐