GORM 一对多关系配置
GORM 支持一对多关系映射,本文介绍 hasMany 的核心用法。
什么是一对多关系
一对多关系指一个模型实例关联多个另一个模型实例,常用于主从表场景,如用户与订单。
hasMany 配置
Go
type User struct {
gorm.Model
Name string
Orders []Order `gorm:"foreignKey:UserID"` // 一对多
}
type Order struct {
gorm.Model
UserID uint
Amount float64
Status string
}
// 关联查询
db.Preload("Orders").First(&user)
关联操作
创建关联数据
Go
// 一起创建
user := User{
Name: "张三",
Orders: []Order{
{Amount: 100, Status: "pending"},
{Amount: 200, Status: "completed"},
},
}
db.Create(&user)
// 单独关联
order := Order{Amount: 300, Status: "pending"}
db.Create(&order)
user.Orders = append(user.Orders, order)
db.Save(&user)
条件预加载
Go
// 只预加载特定条件的关联
db.Preload("Orders", "status = ?", "completed").First(&user)
// 嵌套预加载
db.Preload("Orders.Items").First(&user)
关联统计
Go
// 统计关联记录数
db.Model(&user).Association("Orders").Count()
// 使用 Joins 查询
db.Joins("LEFT JOIN orders ON orders.user_id = users.id").
Select("users.*, COUNT(orders.id) as order_count").
Group("users.id").Find(&users)
hasMany只在一侧配置,另一侧不需要标注关系。
注意事项
Preload产生多条 SQL 查询,数据量大时应考虑Joins方式- 关联切片在创建时应初始化为空切片,避免 nil 问题
- 删除主表记录前应处理所有从表记录(或使用外键级联)
- 关联查询可加索引优化性能
要点总结
hasMany实现一对多关系,外键在多方表中- 使用
Preload加载关联数据,支持条件过滤 Joins方式适合聚合查询和统计- 关联切片需正确初始化,删除注意级联处理
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\关联关系管理\一对多关系配置.md
📝 发现内容有误?点击此处直接编辑