我正在学习Laravel,而且我正在使用Laravel 5.2。我想知道Eager Loading,Constraining Eager Loads和Lazy Eager Loading。这三者有什么相似之处和不同之处?你能举个例子吗?我读过Laravel文档,但我还是不明白。我希望你能给出更明确的解释。感谢。
答案 0 :(得分:2)
果壳:
Eager Loading
可让您有效地获得某些模型的关系。
Constraining Eager Loads
再次提高效率,但您可以限制结果,例如日期范围,具体ID等
Lazy Eager Loading
适用于已加载父模型的情况
示例:
好吧,假设您正在创建一个博客,您将拥有帖子,这些帖子可以有评论和喜欢。
情景1:
您想要使用Posts
及其Comments
获取所有Likes
。您是否会加载所有Posst
然后循环播放它们并到达comments
和likes
?好吧,你可以,但这可能最终会非常昂贵,因为它最终可能会执行许多查询。或者您可以加载帖子,然后获取他们的id
并加载id
所需的所有评论,也可以加载相同的评论。这基本上是Laravel
对预期加载的作用。
场景2(场景1的真实示例):
您正在为帖子创建Feed。所以,你已经加载了所有的帖子,然后你想要显示它有多少喜欢和评论,所以你会有类似的(非常基本的):
控制器:
$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'));
然后会为所有comments
获取likes
和Posts
,然后保存数据库并提高应用程序的效率。
情景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
将被检索,但您仍然希望获得它的关系。
希望这有帮助!