2016-10-22 177 views
0

我正在學習Laravel,而我正在使用Laravel 5.2。我想知道Eager Loading,Constraining Eager Loads和Lazy Eager Loading。這三者之間有什麼異同?你能舉個例子嗎?我已閱讀Laravel文檔,但我仍然不明白。我希望你能給出更明確的解釋。謝謝。渴望加載,約束急切加載,懶惰加載

回答

1

果殼:

Eager Loading,可以有效地得到一些模型的關係。

Constraining Eager Loads再次使其效率,但你可以限制你的結果,例如日期範圍,特定的ID等

Lazy Eager Loading是當你已經擁有你的父母模型加載

例子:

好吧,假設你正在做一個博客,你將有帖子和那些後能有評論和喜歡。

方案1:

你想獲得的所有Posts他們Comments及其Likes。你會加載所有的Posst,然後通過它們循環併到達那裏commentslikes?那麼,你可以這樣做,但這最終可能會非常昂貴,因爲它最終可能會執行許多查詢。或者你可以加載帖子,然後得到他們的id s和加載所有你需要的評論,這些id s和相同的喜歡以及。這實質上就是Laravel用於急切加載。

方案2(方案1的現實世界的例子):

你創建你喂的職位。所以,你已經裝載了你所有的帖子,然後你想顯示有多少喜歡和評論它,所以你會碰到這樣的(很基本的):

控制器:

$posts = App\Post::all(); 

return view('posts.index', compact('posts')); 

刀片文件:

@foreach($posts as $post) 

    <h2>{{ $post->title }}</h2> 

    <p>{{ $post->description }}</p> 

    <p> 
     Likes: {{ $post->likes->count() }} <br> 
     Comments: {{ $post->comments->count() }} 
    </p> 

@endforeach 

以上的工作,但對於每個循環它實際上將查詢數據庫。控制器更改爲:然後

$posts = App\Post::with('likes', 'comments')->get(); 

return view('posts.index', compact('posts')); 

將獲得所有Postscommentslikes事先保存的數據庫,使您的應用更有效。

方案3

我想顯示Posts但我只想要展示的最後3 comments所做的。

$posts = App\Post::with(['comments' => function ($query) { 

     $query->limit(3); 

    }]); 

Lazy Eager Loading是當你已經加載了Posts,然後你需要得到事實畢竟commentslikes。原則相同,但您將使用load而不是with。您可能會使用負載的另一個原因是,如果您爲控制器使用Route model binding,那麼Post將被檢索到,但您仍然想要獲取它的關係。

希望得到這個幫助!

+0

嗯,我真的不明白。因爲在所有例子中,我可以使用限制/約束來加載我想要的內容。那麼,這個限制成爲它們之間的相似性嗎?那麼,有什麼區別?對不起,我在這個主題上仍然是新的 –

+0

@GraceMichelle是的,就是這麼多。如果你想限制他們,你可以不需要。主要的不同之處在於「急切加載」和「懶惰急切加載」之間 - 前者用於加載父母時,後者用於加載父母時。 –

+0

還有其他相似之處嗎?好的,我知道這兩個區別。那麼,這兩者和「約束預期負載」有什麼區別呢? –