首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gorm更新“gorm”的最佳方法是什么?

使用gorm更新“gorm”的最佳方法是什么?
EN

Stack Overflow用户
提问于 2022-07-06 21:14:36
回答 1查看 20关注 0票数 0

我有两个模特

代码语言:javascript
复制
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;"`
}

代码语言:javascript
复制
type Profile struct {
    ID          uint   `gorm:"primarykey" json:"-"`
    UserID      uint   `gorm:"uniqueIndex:idx_uniqueProfile" json:"-"`
    PhoneNumber string `json:"phoneNumber"`

}

假设我有json数据来像这样更新它

代码语言:javascript
复制
    data := schema.UserUpdate{
FirstName: "ABC", LastName: "XYZ", 
Profile: schema.Profile{PhoneNumber: "123445666"}}

我会像这样更新用户

代码语言:javascript
复制
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()))
}

输出结果

用户模型它只更新选定的字段(确定)

代码语言:javascript
复制
UPDATE "users" SET "updated_at"='2022-07-07 00:03:18.57',"first_name"='Fiber',"last_name"='Go lang' WHERE "id" = 11

它插入而不是更新的配置文件模型,它使用原始数据而不是新数据(PhoneNumber)

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

发布于 2022-12-03 17:16:47

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

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

代码语言:javascript
复制
err := database.Db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&updateData).Error

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72889924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档