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 關注
- 243 瀏覽
添加回答
舉報