Skip to content

Commit

Permalink
fix: stmt.Changed zero value filed behavior (#5281)
Browse files Browse the repository at this point in the history
* fix: stmt.Changed zero value filed behavior

* chore: rename var
  • Loading branch information
a631807682 committed Apr 24, 2022
1 parent 395606a commit 9b80fe9
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
9 changes: 6 additions & 3 deletions statement.go
Expand Up @@ -609,10 +609,10 @@ func (stmt *Statement) Changed(fields ...string) bool {
changed := func(field *schema.Field) bool {
fieldValue, _ := field.ValueOf(stmt.Context, modelValue)
if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
if v, ok := stmt.Dest.(map[string]interface{}); ok {
if fv, ok := v[field.Name]; ok {
if mv, mok := stmt.Dest.(map[string]interface{}); mok {
if fv, ok := mv[field.Name]; ok {
return !utils.AssertEqual(fv, fieldValue)
} else if fv, ok := v[field.DBName]; ok {
} else if fv, ok := mv[field.DBName]; ok {
return !utils.AssertEqual(fv, fieldValue)
}
} else {
Expand All @@ -622,6 +622,9 @@ func (stmt *Statement) Changed(fields ...string) bool {
}

changedValue, zero := field.ValueOf(stmt.Context, destValue)
if v {
return !utils.AssertEqual(changedValue, fieldValue)
}
return !zero && !utils.AssertEqual(changedValue, fieldValue)
}
}
Expand Down
10 changes: 8 additions & 2 deletions tests/hooks_test.go
Expand Up @@ -375,13 +375,19 @@ func TestSetColumn(t *testing.T) {
t.Errorf("invalid data after update, got %+v", product)
}

// Code changed, price should changed
DB.Model(&product).Select("Name", "Code", "Price").Updates(Product3{Name: "Product New4", Code: ""})
if product.Name != "Product New4" || product.Price != 320 || product.Code != "" {
t.Errorf("invalid data after update, got %+v", product)
}

DB.Model(&product).UpdateColumns(Product3{Code: "L1215"})
if product.Price != 270 || product.Code != "L1215" {
if product.Price != 320 || product.Code != "L1215" {
t.Errorf("invalid data after update, got %+v", product)
}

DB.Model(&product).Session(&gorm.Session{SkipHooks: true}).Updates(Product3{Code: "L1216"})
if product.Price != 270 || product.Code != "L1216" {
if product.Price != 320 || product.Code != "L1216" {
t.Errorf("invalid data after update, got %+v", product)
}

Expand Down

0 comments on commit 9b80fe9

Please sign in to comment.