检测模型值是否已更改的最简单方法

时间:2019-11-11 16:35:23

标签: go orm go-gorm

我正在将gorm用作Golang ORM。我需要检测是否有任何模型字段已更改以触发第三方API服务的更新。

我尝试使用If语句测试每个字段,但是当模型具有多个字段时,它将变得很丑。

var person Person

db.Where("id = ?", id).First(&person)

if person.Name != body.Person.Name || person.Age != body.Person.Age {
  // Trigger API update
}

db.Save(&person)

有没有简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

我不知道这是否是最简单的方法,it is probably not idiomatic,但是您可以通过反射来实现。以下函数使用reflect Package比较两个Person结构,以查看它们在每个字段中的值是否相同,跳过Model结构(其内部结构独立于{ {1}}代表)。

Person

您可以在代码段中使用它,如下所示:

func (this Person) Equals(that Person) bool {
    vThis := reflect.ValueOf(this)
    vThat := reflect.ValueOf(that)
    for i := 0; i < vThis.NumField(); i++ {
        if vThis.Field(i) != vThis.FieldByName("Model") {
            if vThis.Field(i).Interface() != vThat.Field(i).Interface() {
                return false
            }
        }       
    }
    return true
}

请注意,我还很陌生,因此在“适当的”代码方面,我可能会让您误入歧途。但这确实有效。

答案 1 :(得分:0)

GORM 确实通过可在更新前挂钩中使用的“更改”方法提供了这样的功能。如果字段更改或未更改,则返回。

https://gorm.io/docs/update.html#Check-Field-has-changed