Laravel 关系 - 是否有多个*不必要*的数据库调用?

Laravel relationships - are there multiple *unnecessary* database calls?

我有 2 个模型:PostUser,每个 Post 有一个 User,每个 User 有很多 Post .

User.php:

// User.php

public function posts()
{
    return $this->hasMany(Post::class);
}

Post.php:

// Post.php

public function user()
{
    return $this->hasOne(User::class);
}

我通过 PostsController:

加载了 post
// PostsController.php

public function show($id)
{
    $post = Post::find($id);

    return view('posts.show', compact('post'));
}

在视图中,我调用了我在 中加载的 post 和 到与 post 相关的用户。我多次调用用户对象:

// views/posts/show.blade.php

<h1>{{ $post->title }}</h1>
<p>{{ $post->user->name }}</p>
<p>{{ $post->user->email }}</p>

这 2 次对 $post->user 资源的调用是否会对数据库进行 2 次调用?

Eloquent 关系在后端如何运作?当我得到 post 对象时,关系总是 return 整个 user 对象,还是懒惰地得到 user 数据?

我担心托管我的数据库的提供商会根据从数据库 (GCP) 传输的数据收费,而且我不明白 Eloquent 关系将如何调用数据库。

Laravel 提供了一个名为 Eager Loading 的功能,它允许您通过优化查询来加载模型和任何关系:

Post::with('user')->find($id);

预先加载也适用于许多关系。无论用户拥有多少帖子,以下内容也只会产生两个查询:

User::with('posts')->find($id);

这将加载 Post 实体的用户模型,以便访问它不需要第二次查询。您可以在 docs.

中阅读有关预先加载和其他性能增强的更多信息