解决 N+1 问题:Eloquent ORM 性能优化的必修课

emer 发布于 阅读:103

假设你有两个模型:Post (文章) 和 Comment (评论)。一篇文章有多条评论。
当你获取所有文章并遍历输出评论作者时:

$posts = Post::all(); // 1次查询
foreach ($posts as $post) {
    echo $post->comments->user->name; // 每一轮循环都会触发一次新的SQL查询!
}

如果你有100篇文章,这里就会执行 1 + 100 = 101 次数据库查询。这就是著名的 N+1 问题。
解决方案非常简单: eager loading (预加载)。

$posts = Post::with('comments.user')->get();

这样,Laravel只会执行2次查询:一次查文章,一次查所有相关的评论和用户。性能提升立竿见影。