如何使用结构更新多个属性

How to Update Multiple Attribute With Struct

我试图制作一个可以通过给定参数更新用户的功能。

我的方法:

func UpdateMultiple(db *gorm.DB, user *User, id uint32) error {
    usr := User{}

    err := db.Debug().Model(User{}).Where("id = ?", id).Updates(map[string]interface{}{"email": user.Email, "is_active": false}).Take(&usr).Error
    if err != nil {
        return err
    }
    return nil
}

并像这样使用:

Updater := &User{
    Email:    holder.Email,
    IsActive: false,
}
err = UpdateMultiple(s.DB, Updater, id)

now.But 它工作正常如果想更新另一个字段,我必须更改我的 UpdateMultiple() 方法。有没有其他方法可以在不更改方法但仅更改给定参数值的情况下进行更新?

由于您需要动态更新字段,请先通过 id

获取用户
user := &User{}
db.First(&user, id)

更新您要更新的字段

user.Email = "a@a.com"
user.IsActive = false

并更新用户信息

db.Save(&user)

创建 map[string]interface{} 并添加您要更新的字段。

mp := make(map[string]interface{})
mp["email"] = holder.Email
mp["is_active"] =  false

并更新用户

db.Model(User{}).Where("id = ?", id).Updates(mp)

您可以将您的 User 模型传递给 Updates 函数,它将更新所有具有非空值的结构字段(这意味着所有字段都应该是指针,以便最好使用此功能)。代码如下所示:

func UpdateMultiple(db *gorm.DB, user *User, id uint32) error {
     return db.Debug().
          Model(User{}).
          Where("id = ?", id).
          Updates(user).Error

}

查看官方文档中的一些示例:

// Update multiple attributes with `struct`, will only update those changed & non blank fields
db.Model(&user).Updates(User{Name: "hello", Age: 18})
//// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

// WARNING when update with struct, GORM will only update those fields that with non blank value
// For below Update, nothing will be updated as "", 0, false are blank values of their types
db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false})