对象关系映射(ORM)使得处理数据惊人地简单。由于以面向对象的方式定义数据之间关系使得查询关联模型数据变得容易,开发者不太需要关注数据底层调用。
ORM 的标准数据优化是渴望式加载相关数据。我们将建立一些示例关系,然后逐步了解查询随着渴望式加载和非渴望式加载变化。我喜欢直接使用代码来试验一些东西,并通过一些示例来说明渴望式加载是如何工作的,这将进一步帮助你理解如何优化查询。
介绍
在基本级别,ORM 是 “懒惰” 加载相关的模型数据。但是,ORM 应该如何知道你的意图?在查询模型后,您可能永远不会真正使用相关模型的数据。不优化查询被称为 “N + 1” 问题。当您使用对象来表示查询时,您可能在不知情的情况下进行查询。
想象一下,您收到了 100 个来自数据库的对象,并且每条记录都有 1 个关联的模型(即 belongsTo)。使用 ORM 默认会产生 101 条查询;对原始 100 条记录 进行一次查询,如果访问了模型对象上的相关数据,则对每条记录进行附加查询。在伪代码中,假设您要列出所有已发布帖子的发布作者。从一组帖子(每个帖子有一位作者),您可以得到一个作者姓名列表,如下所示:
$posts = Post::published()->get(); // 一次查询 $authors = array_map(function($post) { // 生成对作者模型的查询 return $post->author->name; }, $posts);