什么是关联
数据库中的表之间经常存在关联。例如一篇博客文章有多条评论,一笔订单归属于下单的用户。 Eloquent 提供了简洁定义和操作这些关联的方式。关联作为 Eloquent 模型的方法进行定义。本页以
User、Post、Comment、Tag 等模型为例。假设这些模型与表已经创建好了。hasOne(一对一)
hasOne 表示某模型拥有另一个模型的一条记录。例如 User 拥有一个 Profile。
定义关联
在User 模型定义 profile 方法:
profiles 表有 user_id 列。
获取关联数据
关联可以作为属性访问:belongsTo(一对一的反向)
belongsTo 是 hasOne 的反向,定义在拥有外键的一侧。例如 Profile 属于 User。
定义关联
user_id)作为外键。
获取关联数据
hasMany(一对多)
hasMany 是最常见的一对多关联。例如一篇 Post 拥有多条 Comment。
定义关联
comments 表有 post_id。
获取关联数据
hasMany 返回集合:
反向关联(belongsTo)
从评论访问文章:belongsToMany(多对多)
多对多用于两个模型互相拥有多个关联。例如Post 有多个 Tag,Tag 也属于多个 Post。
表结构
多对多需要中间表。例如Post 与 Tag 使用 post_tag 中间表:
Eloquent 会按字母顺序拼接两个模型名推断中间表名(
post + tag → post_tag)。定义关联
Tag 上同样定义即可反向访问:
获取关联数据
增删关联数据
用attach 添加、detach 删除中间表记录:
预加载(Eager Loading)
什么是 N+1 问题
以属性方式访问关联,Eloquent 每次都会发查询。这称为「延迟加载」。在循环中访问会产生 N+1 问题。with() 预加载
with() 一次性把关联取回来:
同时预加载多个关联
嵌套预加载
用点号访问嵌套关联:下一步
Eloquent 入门
回顾 Eloquent 的基本 CRUD。