GORM 关联数据创建与更新
本文介绍 GORM 中关联数据的级联创建与更新方法。
级联创建
使用 Create 方法
创建主记录时自动创建关联记录。
Go
// 定义模型
type User struct {
ID uint
Name string
Profile Profile
Orders []Order
}
type Profile struct {
ID uint
UserID uint
Bio string
}
// 级联创建
user := User{
Name: "张三",
Profile: Profile{
Bio: "GORM 开发者",
},
Orders: []Order{
{Product: "GORM 指南", Quantity: 1},
{Product: "Go 编程", Quantity: 2},
},
}
db.Create(&user)
Create 方法会自动填充关联字段的外键值(如 Profile.UserID)。
使用 Association 方法
手动管理关联关系的创建。
Go
// 先创建主记录
user := User{Name: "张三"}
db.Create(&user)
// 添加单个关联
profile := Profile{Bio: "开发者"}
db.Model(&user).Association("Profile").Append(&profile)
// 添加多个关联
order1 := Order{Product: "商品A"}
order2 := Order{Product: "商品B"}
db.Model(&user).Association("Orders").Append(&order1, &order2)
级联更新
使用 Save 方法
Save 方法会级联更新关联记录。
Go
// 查询并修改
var user User
db.Preload("Profile").Preload("Orders").First(&user, 1)
user.Name = "李四"
user.Profile.Bio = "高级开发者"
db.Save(&user)
使用 Update/Updates 方法
仅更新主记录字段,不级联更新关联记录。
Go
// 更新单个字段
db.Model(&user).Update("Name", "李四")
// 更新多个字段
db.Model(&user).Updates(User{Name: "李四", Age: 30})
// 更新关联记录需单独操作
db.Model(&user.Profile).Update("Bio", "新简介")
使用 Association 替换关联
Go
// 替换所有关联(先删除旧关联,再添加新关联)
newOrders := []Order{{Product: "新商品"}}
db.Model(&user).Association("Orders").Replace(newOrders)
// 删除关联(不删除数据库记录)
db.Model(&user).Association("Orders").Delete(&order)
// 清空所有关联
db.Model(&user).Association("Orders").Clear()
注意事项
- Create 方法仅自动填充外键,不会自动预加载关联数据。
- Save 方法会级联更新所有关联记录,需谨慎使用。
- Association 的 Delete/Clear 操作默认只删除关联关系,不删除关联记录本身。
- 级联操作需要模型正确定义 belongsTo、hasMany 等关联标签。
要点总结
- Create方法支持级联创建,自动填充外键值。
- Save方法级联更新所有关联记录,影响范围广。
- Update/Updates仅更新主记录,关联记录需单独更新。
- Association方法提供 Append/Replace/Delete/Clear 四种关联管理方式。
- 级联操作依赖正确的模型关联标签定义。
存放路径:D:\git2\jwdev\articles\GORM\进阶\关联关系管理\关联数据创建与更新.md
📝 发现内容有误?点击此处直接编辑