渴望加载,限制急切负载,懒惰渴望加载

时间:2016-10-22 11:20:15

标签: php laravel laravel-5.2

我正在学习Laravel,而且我正在使用Laravel 5.2。我想知道Eager Loading,Constraining Eager Loads和Lazy Eager Loading。这三者有什么相似之处和不同之处?你能举个例子吗?我读过Laravel文档,但我还是不明白。我希望你能给出更明确的解释。感谢。

1 个答案:

答案 0 :(得分:2)

果壳:

Eager Loading可让您有效地获得某些模型的关系。

Constraining Eager Loads再次提高效率,但您可以限制结果,例如日期范围,具体ID等

Lazy Eager Loading适用于已加载父模型的情况

示例:

好吧,假设您正在创建一个博客,您将拥有帖子,这些帖子可以有评论和喜欢。

情景1:

您想要使用Posts及其Comments获取所有Likes。您是否会加载所有Posst然后循环播放它们并到达commentslikes?好吧,你可以,但这可能最终会非常昂贵,因为它最终可能会执行许多查询。或者您可以加载帖子,然后获取他们的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获取likesPosts,然后保存数据库并提高应用程序的效率。

情景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将被检索,但您仍然希望获得它的关系。

希望这有帮助!