如何使用Struct,Golang GOrm更新多个属性

问题描述 投票:1回答:2

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

我的方法:

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)

目前运行良好。但是,如果要更新其他字段,则必须更改我的UpdateMultiple()方法。我还有其他方法可以在不更改方法而仅更改给定参数值的情况下进行更新吗?

go gorm
2个回答
0
投票
由于需要动态字段更新,因此请先按ID提取用户

user := &User{} db.First(&user, id)

更新您要更新的字段

user.Email = "[email protected]" user.IsActive = false

并更新用户信息

db.Save(&user)


0
投票
您可以将您的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})

© www.soinside.com 2019 - 2024. All rights reserved.