GORM 一对一关系配置
GORM 支持一对一关系映射,本文介绍 hasOne 和 belongsTo 的核心用法。
什么是一对一关系
一对一关系指一个模型实例只关联另一个模型的一个实例,常用于主子表场景,如用户与用户档案。
关系定义
| 关系 | 说明 | 外键位置 |
|---|---|---|
hasOne | 拥有关系,外键在对方表中 | 对方表 |
belongsTo | 属于关系,外键在当前表中 | 当前表 |
hasOne 配置
Go
type User struct {
gorm.Model
Name string
CreditCard CreditCard `gorm:"foreignKey:UserID"` // 一对一
}
type CreditCard struct {
gorm.Model
Number string
UserID uint // 外键
}
// 关联查询
db.Preload("CreditCard").First(&user)
belongsTo 配置
Go
type User struct {
gorm.Model
Name string
CompanyID uint
Company Company `gorm:"foreignKey:CompanyID"` // 属于关系
}
type Company struct {
gorm.Model
Name string
}
// 关联查询
db.Preload("Company").First(&user)
关联操作
创建关联数据
Go
// 方式1:一起创建
user := User{
Name: "张三",
CreditCard: CreditCard{Number: "123456"},
}
db.Create(&user)
// 方式2:单独关联
card := CreditCard{Number: "789012"}
db.Create(&card)
user.CreditCard = card
db.Save(&user)
关联查询条件
Go
// 根据关联字段查询
db.Joins("JOIN credit_cards ON credit_cards.user_id = users.id").
Where("credit_cards.number = ?", "123456").
First(&user)
hasOne和belongsTo是同一关系的双向视角,选择取决于你从哪个模型出发。
注意事项
foreignKey指定外键字段名,默认是关联模型名 + IDPreload使用 JOIN 预加载,避免 N+1 查询问题- 外键字段应加索引提升查询性能
- 删除主表记录前应处理关联的从表记录
要点总结
hasOne外键在对方表,belongsTo外键在当前表- 使用
Preload预加载关联数据 - 关系是双向的,根据查询方向选择标注方式
- 外键字段建议加索引优化查询
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\关联关系管理\一对一关系配置.md
📝 发现内容有误?点击此处直接编辑