【问题标题】:What is the best way to update `HAS ONE` using gorm?使用 gorm 更新“HAS ONE”的最佳方法是什么?
【发布时间】:2022-12-04 01:41:47
【问题描述】:

我有两个模型

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"

【问题讨论】:

    标签: postgresql go-gorm fibers


    【解决方案1】:

    如果要更新关联数据,则必须将 FullSaveAssociations 设置为 true。查看:https://gorm.io/docs/session.html

    因此,您的更新查询应如下所示:

    err := database.Db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&updateData).Error
    

    并确保在 updateData 中或通过 WHERE 子句指定用户和配置文件 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多