fix: stmt.Changed zero value filed behavior
This commit is contained in:
		
							parent
							
								
									74e07b049c
								
							
						
					
					
						commit
						e331c04e1e
					
				@ -605,10 +605,10 @@ func (stmt *Statement) Changed(fields ...string) bool {
 | 
				
			|||||||
	changed := func(field *schema.Field) bool {
 | 
						changed := func(field *schema.Field) bool {
 | 
				
			||||||
		fieldValue, _ := field.ValueOf(stmt.Context, modelValue)
 | 
							fieldValue, _ := field.ValueOf(stmt.Context, modelValue)
 | 
				
			||||||
		if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
 | 
							if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
 | 
				
			||||||
			if v, ok := stmt.Dest.(map[string]interface{}); ok {
 | 
								if mapV, mapOk := stmt.Dest.(map[string]interface{}); mapOk {
 | 
				
			||||||
				if fv, ok := v[field.Name]; ok {
 | 
									if fv, ok := mapV[field.Name]; ok {
 | 
				
			||||||
					return !utils.AssertEqual(fv, fieldValue)
 | 
										return !utils.AssertEqual(fv, fieldValue)
 | 
				
			||||||
				} else if fv, ok := v[field.DBName]; ok {
 | 
									} else if fv, ok := mapV[field.DBName]; ok {
 | 
				
			||||||
					return !utils.AssertEqual(fv, fieldValue)
 | 
										return !utils.AssertEqual(fv, fieldValue)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
@ -618,6 +618,9 @@ func (stmt *Statement) Changed(fields ...string) bool {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				changedValue, zero := field.ValueOf(stmt.Context, destValue)
 | 
									changedValue, zero := field.ValueOf(stmt.Context, destValue)
 | 
				
			||||||
 | 
									if v {
 | 
				
			||||||
 | 
										return !utils.AssertEqual(changedValue, fieldValue)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				return !zero && !utils.AssertEqual(changedValue, fieldValue)
 | 
									return !zero && !utils.AssertEqual(changedValue, fieldValue)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -375,13 +375,19 @@ func TestSetColumn(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("invalid data after update, got %+v", product)
 | 
							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"})
 | 
						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)
 | 
							t.Errorf("invalid data after update, got %+v", product)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DB.Model(&product).Session(&gorm.Session{SkipHooks: true}).Updates(Product3{Code: "L1216"})
 | 
						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)
 | 
							t.Errorf("invalid data after update, got %+v", product)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user