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

时间:2017-10-19 22:33:35

标签: php mysql laravel laravel-5.5

我有2个模型:PostUser,其中每个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关系如何调用数据库。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

这将加载Post实体的用户模型,以便访问它不需要第二次查询。您可以在docs中了解有关预先加载和其他性能增强的更多信息。