作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个一对一的关系,位置,使用 postgresql:
type App struct {
gorm.Model
PersoID string `gorm:"primary_key;unique" json:"perso_id"`
Location OllyLocation `gorm:"foreignkey:location_id"`
LocationID *uint `json:"-" gorm:"type:integer REFERENCES locations(id)"`
Users []User `json:"users,omitempty" gorm:"many2many:app_users;"`
}
type Location struct {
ID uint `json:"-" gorm:"primary_key;unique"`
CreatedAt time.Time `json:"-"`
UpdatedAt time.Time
Lat float64 `json:"lat"`
Long float64 `json:"long"`
Address string `json:"address"`
Country string `json:"country"`
}
但如您所见,App 结构有自己的主键 ID 作为字符串(和 GORM 一样)。因此,此 block 无法从 gorm 执行简单的 db.Save()
。
所以我尝试过:
func (previousModel *App) UpdateAndReturnedUpdated(db *gorm.DB, appUpdated *App) error {
if err := db.Model(previousModel).Update(appUpdated).Error; err != nil {
return err
}
return db.Preload("Location").First(previousModel, App{PersoID: appUpdated.PersoID}).Error
}
有了这个,应用程序就正确更新了——太棒了! - 但不是位置。
使用新值在数据库中重新创建位置,并在 App 上更新 foreignKey LocationID。
这非常烦人,因为如果我只想更新地址而不指定其他字段,它们只会使用原始类型值重新创建(纬度/经度将为 0)
关于如何更新外键有什么想法吗?谢谢!
最佳答案
您可以使用它来不修改关联的实体
db.Set("gorm:save_associations", false).保存(previousModel)
或者只保存结构的一个字段
db.Model(previousModel).UpdateColumn("PersoID", appUpdated.PersoID)
如果你想更新关联的实体而不是关系您将需要更新实体本身
db.Model(Location{ID:*previousModel.LocationID}).Update(appUpdated.Location)
关于postgresql - 更新字段创建新的外键项而不是更新它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51947674/
我是一名优秀的程序员,十分优秀!