我想知道当您预加载关系并使用
lazy
传输数据时会发生什么。
例如:
$query = User::query()
->where('age', '>=', 18)
->with([
'posts' => ['images'],
'comments'
]);
foreach($query->lazy(1000) as $user) {
// do stuff with preloaded data
}
在这种情况下,
with
语句的表现如何?是否只预加载 1000 个块?
每个块都会执行自己的查询。
为了说明这一点,我将通过仅考虑
User
和 Post
模型来简化您的示例(User
有许多 Post
/ Post
属于 User
)。
假设数据库中只有 13 个用户(ID 1 到 13)
以下代码:
$query = User::with('posts')->orderBy('id');
foreach ($query->lazy(5) as $user) {
echo $user->id . "\n";
}
会执行以下操作
// query select * from users order by id asc limit 5 offset 0
// query select * from posts where user_id in (1,2,3,4,5)
1
2
3
4
5
// query select * from users order by id asc limit 5 offset 5
// query select * from posts where user_id in (6,7,8,9,10)
6
7
8
9
10
// query select * from users order by id asc limit 5 offset 10
// query select * from posts where user_id in (11,12,13)
11
12
13
如果您想亲自查看此内容,可以使用
DB::listen
来帮助。我是在 artisan 控制台中完成的
DB::listen(fn ($query) => dump($query->sql));
$query = User::with('posts')->orderBy('id');
foreach ($query->lazy(5) as $user) {
dump($user->id);
}