更新使用Gorm的最佳方法是什么?
我有两个模型
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您想更新关联数据,则必须将全面的循环设置为True。检查一下: https://gorm.io/docs/session.html
因此,您的更新查询将看起来像:
并确保在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:
And make sure to specify the User and Profile IDs in updateData or through a WHERE clause.