2017-10-19 58 views
1

我有2個型號:PostUser其中每個Post有一個User和每個User有許多Post s。Laravel關係 - 有多個*不必要*數據庫調用嗎?

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> 

將這些2個來電來$post->user資源使2個調用數據庫?

如何在後端雄辯關係的工作?請問關係總是返回整個user對象時,我得到了post對象,或者它懶洋洋地得到user數據?

我關心與收費標準及依據從數據庫(GCP)傳送的數據,我不明白雄辯的關係將如何調用數據庫提供商託管我的數據庫。

+0

[來自文檔](https://laravel.com/docs/5.5/eloquent-relationships#relationship-methods-vs-dynamic-properties):動態屬性是「延遲加載」,這意味着它們只會加載它們的關係數據當你真正訪問他們 – ljubadr

+0

它將爲'$後> user' – ljubadr

+0

我覺得這個問題太寬泛只運行一次。你所要求的內容在文檔和源代碼中都有涉及。 – fubar

回答

3

Laravel提供了一個叫做Eager Loading功能,它可以讓你加載模型,並通過優化查詢任何關係:

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

預先加載了許多關係的工作也是如此。下面的方式也將導致在短短的兩個查詢,而不管用戶有職位的數量:

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

這將加載後實體的用戶模型,以便訪問它不會需要第二個查詢。您可以在docs中閱讀更多關於急切加載和其他性能增強的信息。

+1

急切加載會做2個查詢:... __感謝,我們可以使用急切的加載將此操作減少爲2個查詢。查詢時,您可以指定哪些關係應該是急於加載使用與method__ ... – ljubadr

+0

我會更新的答案了一下,以覆蓋問題__Will這2調用到$後>用戶資源使2個調用數據庫?__。看看我的意見下面的問題,並在此擴大;) – ljubadr

+0

任何其他問題深入覆蓋文檔。我可以複製粘貼的文檔或只是鏈接出來,交給他們,因爲我已經有:) – samrap