GORM 设值表里某个字段值不能修改
时间: 2024-01-12 12:05:04 浏览: 24
可以通过 GORM 的 Hooks 机制来实现某个字段的值不可被修改。具体步骤如下:
1. 在模型结构体中定义一个变量用于存储该字段的原始值,例如:
```go
type User struct {
gorm.Model
Name string
Age int
// 定义一个变量用于存储 Age 字段的原始值
ageBeforeUpdate int
}
```
2. 在 `BeforeUpdate` Hook 中获取该字段的原始值,并将其存储到上面定义的变量中:
```go
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
var oldUser User
if err := tx.First(&oldUser, u.ID).Error; err != nil {
return err
}
u.ageBeforeUpdate = oldUser.Age
return nil
}
```
3. 在模型结构体中定义一个 Setter 方法用于设置该字段的值,但是在 Setter 方法中判断该字段的值是否被修改过,如果被修改过,则返回一个错误,例如:
```go
func (u *User) SetAge(age int) error {
if u.ageBeforeUpdate != age {
return errors.New("age field can not be updated")
}
u.Age = age
return nil
}
```
这样,当你试图修改 Age 字段的值时,如果修改的值和原始值不相等,则会返回一个错误,从而避免了该字段的值被修改。