### [](https://octobercms.com/docs/database/relations#eager-loading)渴望加载
当访问关系作为属性时,关系数据是“延迟加载”的。这意味着直到您首次访问该属性,关系数据才被实际加载。但是,在查询父模型时,模型可以“渴望加载”关系。较早的加载减轻了N + 1查询问题。为了说明N + 1查询问题,请考虑`Book`与以下相关的模型`Author`:
~~~
class Book extends Model
{
public $belongsTo = [
'author' => ['Acme\Blog\Models\Author']
];
}
~~~
现在,让我们检索所有书籍及其作者:
~~~
$books = Book::all();
foreach ($books as $book) {
echo $book->author->name;
}
~~~
此循环将执行1个查询以检索表上的所有书籍,然后对每个书籍执行另一个查询以检索作者。因此,如果我们有25本书,则此循环将运行26个查询:1个查询原始图书,另外25个查询检索每本书的作者。
值得庆幸的是,我们可以使用紧急加载将此操作减少为仅2个查询。查询时,您可以使用以下`with`方法指定应该急切加载的关系:
~~~
$books = Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
~~~
对于此操作,将仅执行两个查询:
~~~
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
~~~
#### 渴望加载多个关系
有时,您可能需要在单个操作中急于加载几个不同的关系。为此,只需将其他参数传递给该`with`方法:
~~~
$books = Book::with('author', 'publisher')->get();
~~~
#### 嵌套的渴望加载
要渴望加载嵌套关系,可以使用“点”语法。例如,让我们热切地在一个声明中加载本书的所有作者和所有作者的个人联系人:
~~~
$books = Book::with('author.contacts')->get();
~~~
### [](https://octobercms.com/docs/database/relations#constraining-eager-loads)限制渴望的负荷
有时您可能希望渴望加载一个关系,但同时为渴望加载查询指定其他查询约束。这是一个例子:
~~~
$users = User::with([
'posts' => function ($query) {
$query->where('title', 'like', '%first%');
}
])->get();
~~~
在此示例中,只有帖子的`title`列中包含单词,模型才会渴望加载帖子`first`。当然,您可以调用其他[查询构建器](https://octobercms.com/docs/database/query)方法来进一步自定义急切的加载操作:
~~~
$users = User::with([
'posts' => function ($query) {
$query->orderBy('created_at', 'desc');
}
])->get();
~~~
### [](https://octobercms.com/docs/database/relations#lazy-eager-loading)懒惰的渴望加载
有时您可能需要在已检索父模型之后急于加载关系。例如,如果您需要动态决定是否加载相关模型,这可能会很有用:
~~~
$books = Book::all();
if ($someCondition) {
$books->load('author', 'publisher');
}
~~~
如果您需要在预加载查询中设置其他查询约束,则可以将传递`Closure`给`load`方法:
~~~
$books->load([
'author' => function ($query) {
$query->orderBy('published_date', 'asc');
}
]);
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图