2 回答
TA贡献1873条经验 获得超9个赞
这是Gorm联想的两件事,我觉得在其文档中没有充分传达,这继续让开发人员感到困惑。
1) 它使用 ID 来标识关联的实体
当您更新该技能列表时,如果它们中没有要添加的ID,则它们只是要添加的新实体。这会导致您的值重复。即使您有一个字段,如果该字段不是实体的主键,则 gorm 将尝试创建新记录并导致约束冲突。unique
有几种方法可以解决这个问题:
确保 API 用户必须为相关实体提供 ID
通过用户提供的其他代理键从数据库中提取实体 ID,并将其填充到要保存的实体中。在你的情况下,这可能是因为它是独一无二的。
name
使该代理键成为主键(使结构成为)。
name
gorm:"primaryKey"
Skill
2) 更新时,它不会删除关联切片中未显示的现有关联
调用 Save/Update gorm 时,不会删除集合关联远端的实体。这是一项安全功能,可避免在简单的保存/更新中意外删除数据。你必须明确地想要这种行为。
要解决此问题,您可以使用关联模式替换集合,作为更新的一部分:。db.Model(&job).Association('Skills').Replace(&job.Skills)
TA贡献2012条经验 获得超12个赞
详细阐述Eziquel的答案,并展示什么对我有用。
我更新了我的技能结构,将 用作主键Name
type Skill struct {
Name string `json:"name,omitempty" gorm:"primary_key"`
}
然后,我阅读了一些文档,只是使用不确定它的作用,但是没有它,关联就会复制或未更新。gorm.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&j)
func UpdateJob(w http.ResponseWriter, r *http.Request) {
j := &Job{}
err := json.NewDecoder(r.Body).Decode(j)
if err != nil {
return
}
database.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&j)
database.DB.Model(&j).Association("Skills").Replace(&j.Skills)
render.JSON(w, r, &j)
}
我不知道该怎么办,但我看到Jihnzu说要在文档中使用它,没有进一步的解释。结合使用,请确保没有重复项,并且关联会更新。database.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&j).Association("Skills").Replace(&j.Skills)
如果有多个,你会做的:
database.DB.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&j)
database.DB.Model(&j).Association("Skills").Replace(&j.Skills)
database.DB.Model(&j).Association("Locations").Replace(&j.Locations)
- 2 回答
- 0 关注
- 207 浏览
添加回答
举报