Laravel 同时进行急切加载和延迟加载

问题描述 投票:0回答:1

我想知道当您预加载关系并使用

lazy
传输数据时会发生什么。

例如:

$query = User::query()
    ->where('age', '>=', 18)
    ->with([
        'posts' => ['images'],
        'comments'
    ]);

foreach($query->lazy(1000) as $user) {
  // do stuff with preloaded data
}

在这种情况下,

with
语句的表现如何?是否只预加载 1000 个块?

laravel eloquent
1个回答
0
投票

每个块都会执行自己的查询。

为了说明这一点,我将通过仅考虑

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.