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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用结构更新多个属性相关的知识,希望对你有一定的参考价值。

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

我的方法:

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()方法。我还有其他方法可以在不更改方法而仅更改给定参数值的情况下进行更新吗?

答案
您可以将您的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})

另一答案
由于需要动态字段更新,因此请先通过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)

以上是关于如何使用结构更新多个属性的主要内容,如果未能解决你的问题,请参考以下文章

将多个输出中的hls属性设置为单独的片段代码

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

如何在多个页面使用同一个HTML片段

如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

如何正确地将多个片段添加到片段过渡?