我有2个模型:Post
和User
,其中每个Post
只有一个User
,每个User
都有Post
个。{ / p>
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'));
}
在视图中,我调用我在和中加载的帖子给与帖子相关的用户。我多次调用用户对象:
// views/posts/show.blade.php
<h1>{{ $post->title }}</h1>
<p>{{ $post->user->name }}</p>
<p>{{ $post->user->email }}</p>
对$post->user
资源的这2次调用是否会对数据库进行2次调用?
Eloquent关系如何在后端运作?当我获得user
对象时,关系是否始终返回整个post
对象,还是懒得获取user
数据?
我担心使用提供商托管我的数据库,该提供商根据从数据库(GCP)传输的数据收费,而且我不了解Eloquent关系如何调用数据库。
答案 0 :(得分:3)
Laravel提供了一个名为Eager Loading的功能,可让您通过优化查询来加载模型和任何关系:
Post::with('user')->find($id);
渴望加载也适用于许多关系。无论用户拥有多少帖子,以下内容也只会产生两个查询:
User::with('posts')->find($id);
这将加载Post实体的用户模型,以便访问它不需要第二次查询。您可以在docs中了解有关预先加载和其他性能增强的更多信息。