更新使用Gorm的最佳方法是什么?

发布于 2025-02-13 18:07:20 字数 1971 浏览 0 评论 0原文

我有两个模型

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()))
}

输出结果

用户模型,它仅更新选定字段(ok)

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"

I have two models

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;"`
}

and

type Profile struct {
    ID          uint   `gorm:"primarykey" json:"-"`
    UserID      uint   `gorm:"uniqueIndex:idx_uniqueProfile" json:"-"`
    PhoneNumber string `json:"phoneNumber"`

}

Assuming i have json data to update it like this

    data := schema.UserUpdate{
FirstName: "ABC", LastName: "XYZ", 
Profile: schema.Profile{PhoneNumber: "123445666"}}

and I update user like this

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()))
}

Output results

User Model it only update selected fields (OK)

UPDATE "users" SET "updated_at"='2022-07-07 00:03:18.57',"first_name"='Fiber',"last_name"='Go lang' WHERE "id" = 11

Profile Model it insert instead of updating and it uses original data instead of new data(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"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半夏半凉 2025-02-20 18:07:20

如果您想更新关联数据,则必须将全面的循环设置为True。检查一下: https://gorm.io/docs/session.html

因此,您的更新查询将看起来像:

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

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

You have to set FullSaveAssociations to true if you want to update associations data. Check it out: https://gorm.io/docs/session.html

Therefore your update query shall look like:

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

And make sure to specify the User and Profile IDs in updateData or through a WHERE clause.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文