我正在将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)
有没有简单的方法来实现这一目标?
答案 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 确实通过可在更新前挂钩中使用的“更改”方法提供了这样的功能。如果字段更改或未更改,则返回。