From 6041c66b0d0ae410cc94935040341cc0c89e1cf6 Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Wed, 28 Aug 2024 00:16:09 +0800 Subject: [PATCH] fix --- callbacks/update.go | 47 ++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/callbacks/update.go b/callbacks/update.go index db7f513c5..7e0ebd9ab 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -45,19 +45,15 @@ func BeforeUpdate(db *gorm.DB) { if db.Statement.Schema.BeforeUpdate { beforeUpdateInterface, isBeforeUpdateHook = value.(BeforeUpdateInterface) } - - var ( - called bool - rv reflect.Value - rvSnapshot reflect.Value - ) - if isBeforeSaveHook || isBeforeUpdateHook { - called = true - // save a snapshot of the struct before the hook was called - rv = reflect.Indirect(reflect.ValueOf(value)) - rvSnapshot = reflect.New(rv.Type()).Elem() - rvSnapshot.Set(rv) + if !isBeforeSaveHook && !isBeforeUpdateHook { + return false } + + // save a snapshot of the struct before the hook was called + rv := reflect.Indirect(reflect.ValueOf(value)) + rvSnapshot := reflect.New(rv.Type()).Elem() + rvSnapshot.Set(rv) + if isBeforeSaveHook { db.AddError(beforeSaveInterface.BeforeSave(tx)) } @@ -65,22 +61,21 @@ func BeforeUpdate(db *gorm.DB) { db.AddError(beforeUpdateInterface.BeforeUpdate(tx)) } - if called { - for _, field := range db.Statement.Schema.Fields { - if field.PrimaryKey { - continue - } - dbFieldName, ok := field.TagSettings["COLUMN"] - if !ok { - continue - } - // compare with the snapshot and update the field if there is a difference - if !reflect.DeepEqual(rv.FieldByName(field.Name).Interface(), rvSnapshot.FieldByName(field.Name).Interface()) { - db.Statement.SetColumn(dbFieldName, rv.FieldByName(field.Name).Interface()) - } + for _, field := range db.Statement.Schema.Fields { + if field.PrimaryKey { + continue + } + dbFieldName, ok := field.TagSettings["COLUMN"] + if !ok { + continue + } + // compare with the snapshot and update the field if there is a difference + if !reflect.DeepEqual(rv.FieldByName(field.Name).Interface(), rvSnapshot.FieldByName(field.Name).Interface()) { + db.Statement.SetColumn(dbFieldName, rv.FieldByName(field.Name).Interface()) } } - return called + + return true }) } }