我有两个模特
type User {
ID uint `gorm:"primarykey" json:"-"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Email string `json:"email"`
Profile Profile `gorm:"constraint:OnDelete:CASCADE;"`
}和
type Profile struct {
ID uint `gorm:"primarykey" json:"-"`
UserID uint `gorm:"uniqueIndex:idx_uniqueProfile" json:"-"`
PhoneNumber string `json:"phoneNumber"`
}假设我有json数据来像这样更新它
data := schema.UserUpdate{
FirstName: "ABC", LastName: "XYZ",
Profile: schema.Profile{PhoneNumber: "123445666"}}我会像这样更新用户
var user authmodels.User
// get user object to be updated
if err := database.Db.Joins("Profile").First(&user, "uid = ?", uid).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return c.Status(fiber.StatusNotFound).JSON(er.NotFound(""))
}
return c.Status(fiber.StatusBadRequest).JSON(er.BadRequest(err.Error()))
}
// data used to update user object
var updateData = authmodels.User{FirstName: data.FirstName, LastName: data.LastName,
Profile: authmodels.Profile{PhoneNumber: data.Profile.PhoneNumber}}
// update user object and it's profile as well
if err := database.Db.Model(&user).Updates(updateData).Error; err != nil {
return c.Status(fiber.StatusBadRequest).JSON(er.BadRequest(err.Error()))
}输出结果
用户模型它只更新选定的字段(确定)
UPDATE "users" SET "updated_at"='2022-07-07 00:03:18.57',"first_name"='Fiber',"last_name"='Go lang' WHERE "id" = 11它插入而不是更新的配置文件模型,它使用原始数据而不是新数据(PhoneNumber)
INSERT INTO "profiles" ("created_at","updated_at","user_id","phone_number","id") VALUES ('2022-07-06 23:58:25.61','2022-07-06 23:58:25.61',11,'255765889960',15) ON CONFLICT ("id") DO UPDATE SET "user_id"="excluded"."user_id" RETURNING "id"发布于 2022-12-03 17:16:47
如果要更新关联数据,则必须将FullSaveAssociations设置为true。查看一下:https://gorm.io/docs/session.html
因此,您的更新查询应该如下所示:
err := database.Db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&updateData).Error并确保在updateData中或通过WHERE子句指定用户和概要文件ID。
https://stackoverflow.com/questions/72889924
复制相似问题