Laravel 关系 - 是否有多个*不必要*的数据库调用?
Laravel relationships - are there multiple *unnecessary* database calls?
我有 2 个模型:Post
和 User
,每个 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.
中阅读有关预先加载和其他性能增强的更多信息
我有 2 个模型:Post
和 User
,每个 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
:
// 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.
中阅读有关预先加载和其他性能增强的更多信息