gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:01:07 25 4
gpt4 key购买 nike

我确实试图理解 with() 方法和 load() 方法之间的区别,但无法真正理解。

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

我理解错了吗?

最佳答案

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

这里的“Eager”意味着我们仅使用一个查询来关联特定结果集的所有相关模型,而不是必须运行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 来获取任何项目的相关模型。

<小时/>

为什么使用load()with()load() 使您可以选择稍后根据某些动态条件决定是否需要运行第二个查询。但是,如果您确实需要访问所有相关项,请使用 with()

<小时/>

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

关于laravel with() 方法与 load() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005994/

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