我正在學習Laravel,而我正在使用Laravel 5.2。我想知道Eager Loading,Constraining Eager Loads和Lazy Eager Loading。這三者之間有什麼異同?你能舉個例子嗎?我已閱讀Laravel文檔,但我仍然不明白。我希望你能給出更明確的解釋。謝謝。渴望加載,約束急切加載,懶惰加載
0
A
回答
1
果殼:
Eager Loading
,可以有效地得到一些模型的關係。
Constraining Eager Loads
再次使其效率,但你可以限制你的結果,例如日期範圍,特定的ID等
Lazy Eager Loading
是當你已經擁有你的父母模型加載
例子:
好吧,假設你正在做一個博客,你將有帖子和那些後能有評論和喜歡。
方案1:
你想獲得的所有Posts
他們Comments
及其Likes
。你會加載所有的Posst
,然後通過它們循環併到達那裏comments
和likes
?那麼,你可以這樣做,但這最終可能會非常昂貴,因爲它最終可能會執行許多查詢。或者你可以加載帖子,然後得到他們的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'));
將獲得所有Posts
的comments
和likes
事先保存的數據庫,使您的應用更有效。
方案3
我想顯示Posts
但我只想要展示的最後3 comments
所做的。
$posts = App\Post::with(['comments' => function ($query) {
$query->limit(3);
}]);
Lazy Eager Loading
是當你已經加載了Posts
,然後你需要得到事實畢竟comments
或likes
。原則相同,但您將使用load
而不是with
。您可能會使用負載的另一個原因是,如果您爲控制器使用Route model binding
,那麼Post
將被檢索到,但您仍然想要獲取它的關係。
希望得到這個幫助!
相關問題
- 1. Laravel懶惰渴望加載訂購
- 2. Yii:嵌套懶惰加載與渴望加載
- 3. 懶惰加載和急切加載在Nhibernate
- 4. Rails 3:懶惰加載與急切加載
- 5. 懶惰加載不加載
- 6. 懶惰vs急於加載JPA
- 7. 使用Yii Active Record懶惰加載或渴望加載的最佳條件?
- 8. 再一次:EF 5代碼首先渴望與懶惰加載
- 9. 移動遠程數據加載:懶惰vs渴望
- 10. 動態渴望&懶惰在休眠加載
- 11. 爲什麼使用懶惰/渴望加載數據庫級別
- 12. 如何以編程方式檢查懶惰/渴望加載
- 13. 懶惰,渴望,顯式加載意味着什麼?
- 14. 控制什麼是懶惰(或渴望)加載
- 15. 懶惰加載flexslider
- 16. GWT懶惰加載
- 17. Android懶惰加載
- 18. 懶惰加載Ninject
- 19. Autofac懶惰加載
- 20. Eclipselink懶惰加載
- 21. 休眠懶加載不工作,強制需要急切加載
- 22. 在EF6中急切,懶惰和顯式加載
- 23. Hibernate的急切和懶惰加載與實體
- 24. Laravel 4渴望加載
- 25. Laravel嵌套渴望加載
- 26. Laravel渴望加載4表
- 27. 渴望加載has_many通過
- 28. 渴望加載to_json包括
- 29. 什麼是渴望加載?
- 30. Laravel渴望加載和whereHas
嗯,我真的不明白。因爲在所有例子中,我可以使用限制/約束來加載我想要的內容。那麼,這個限制成爲它們之間的相似性嗎?那麼,有什麼區別?對不起,我在這個主題上仍然是新的 –
@GraceMichelle是的,就是這麼多。如果你想限制他們,你可以不需要。主要的不同之處在於「急切加載」和「懶惰急切加載」之間 - 前者用於加載父母時,後者用於加載父母時。 –
還有其他相似之處嗎?好的,我知道這兩個區別。那麼,這兩者和「約束預期負載」有什麼區別呢? –