0

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"
Luqman Jr
  • 69
  • 1
  • 5

1 Answers1

1

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.

mello
  • 114
  • 4