optimize for logic,if logic and setupValuerAndSetter func.
This commit is contained in:
parent
a689e56433
commit
9653eaf0fe
@ -22,10 +22,12 @@ func SaveBeforeAssociations(create bool) func(db *gorm.DB) {
|
|||||||
|
|
||||||
setupReferences := func(obj reflect.Value, elem reflect.Value) {
|
setupReferences := func(obj reflect.Value, elem reflect.Value) {
|
||||||
for _, ref := range rel.References {
|
for _, ref := range rel.References {
|
||||||
if !ref.OwnPrimaryKey {
|
if ref.OwnPrimaryKey {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
pv, _ := ref.PrimaryKey.ValueOf(elem)
|
pv, _ := ref.PrimaryKey.ValueOf(elem)
|
||||||
db.AddError(ref.ForeignKey.Set(obj, pv))
|
db.AddError(ref.ForeignKey.Set(obj, pv))
|
||||||
|
|
||||||
if dest, ok := db.Statement.Dest.(map[string]interface{}); ok {
|
if dest, ok := db.Statement.Dest.(map[string]interface{}); ok {
|
||||||
dest[ref.ForeignKey.DBName] = pv
|
dest[ref.ForeignKey.DBName] = pv
|
||||||
if _, ok := dest[rel.Name]; ok {
|
if _, ok := dest[rel.Name]; ok {
|
||||||
@ -34,7 +36,6 @@ func SaveBeforeAssociations(create bool) func(db *gorm.DB) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
switch db.Statement.ReflectValue.Kind() {
|
switch db.Statement.ReflectValue.Kind() {
|
||||||
case reflect.Slice, reflect.Array:
|
case reflect.Slice, reflect.Array:
|
||||||
@ -51,8 +52,10 @@ func SaveBeforeAssociations(create bool) func(db *gorm.DB) {
|
|||||||
elems := reflect.MakeSlice(reflect.SliceOf(fieldType), 0, 10)
|
elems := reflect.MakeSlice(reflect.SliceOf(fieldType), 0, 10)
|
||||||
for i := 0; i < db.Statement.ReflectValue.Len(); i++ {
|
for i := 0; i < db.Statement.ReflectValue.Len(); i++ {
|
||||||
obj := db.Statement.ReflectValue.Index(i)
|
obj := db.Statement.ReflectValue.Index(i)
|
||||||
|
if reflect.Indirect(obj).Kind() != reflect.Struct {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
if reflect.Indirect(obj).Kind() == reflect.Struct {
|
|
||||||
if _, zero := rel.Field.ValueOf(obj); !zero { // check belongs to relation value
|
if _, zero := rel.Field.ValueOf(obj); !zero { // check belongs to relation value
|
||||||
rv := rel.Field.ReflectValueOf(obj) // relation reflect value
|
rv := rel.Field.ReflectValueOf(obj) // relation reflect value
|
||||||
objs = append(objs, obj)
|
objs = append(objs, obj)
|
||||||
@ -62,18 +65,13 @@ func SaveBeforeAssociations(create bool) func(db *gorm.DB) {
|
|||||||
elems = reflect.Append(elems, rv.Addr())
|
elems = reflect.Append(elems, rv.Addr())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if elems.Len() > 0 {
|
if elems.Len() > 0 && saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil) == nil {
|
||||||
if saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil) == nil {
|
|
||||||
for i := 0; i < elems.Len(); i++ {
|
for i := 0; i < elems.Len(); i++ {
|
||||||
setupReferences(objs[i], elems.Index(i))
|
setupReferences(objs[i], elems.Index(i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
if _, zero := rel.Field.ValueOf(db.Statement.ReflectValue); !zero {
|
if _, zero := rel.Field.ValueOf(db.Statement.ReflectValue); !zero {
|
||||||
rv := rel.Field.ReflectValueOf(db.Statement.ReflectValue) // relation reflect value
|
rv := rel.Field.ReflectValueOf(db.Statement.ReflectValue) // relation reflect value
|
||||||
|
@ -209,7 +209,7 @@ func Preload(db *gorm.DB) {
|
|||||||
if rel := db.Statement.Schema.Relationships.Relations[name]; rel != nil {
|
if rel := db.Statement.Schema.Relationships.Relations[name]; rel != nil {
|
||||||
preload(db, rel, db.Statement.Preloads[name], preloadMap[name])
|
preload(db, rel, db.Statement.Preloads[name], preloadMap[name])
|
||||||
} else {
|
} else {
|
||||||
db.AddError(fmt.Errorf("%v: %w for schema %v", name, gorm.ErrUnsupportedRelation, db.Statement.Schema.Name))
|
db.AddError(fmt.Errorf("%s: %w for schema %s", name, gorm.ErrUnsupportedRelation, db.Statement.Schema.Name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -490,21 +490,22 @@ func (field *Field) setupValuerAndSetter() {
|
|||||||
return
|
return
|
||||||
} else if field.FieldType.Kind() == reflect.Ptr {
|
} else if field.FieldType.Kind() == reflect.Ptr {
|
||||||
fieldValue := field.ReflectValueOf(value)
|
fieldValue := field.ReflectValueOf(value)
|
||||||
|
fieldType := field.FieldType.Elem()
|
||||||
|
|
||||||
if reflectValType.AssignableTo(field.FieldType.Elem()) {
|
if reflectValType.AssignableTo(fieldType) {
|
||||||
if !fieldValue.IsValid() {
|
if !fieldValue.IsValid() {
|
||||||
fieldValue = reflect.New(field.FieldType.Elem())
|
fieldValue = reflect.New(fieldType)
|
||||||
} else if fieldValue.IsNil() {
|
} else if fieldValue.IsNil() {
|
||||||
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
fieldValue.Set(reflect.New(fieldType))
|
||||||
}
|
}
|
||||||
fieldValue.Elem().Set(reflectV)
|
fieldValue.Elem().Set(reflectV)
|
||||||
return
|
return
|
||||||
} else if reflectValType.ConvertibleTo(field.FieldType.Elem()) {
|
} else if reflectValType.ConvertibleTo(fieldType) {
|
||||||
if fieldValue.IsNil() {
|
if fieldValue.IsNil() {
|
||||||
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
fieldValue.Set(reflect.New(fieldType))
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldValue.Elem().Set(reflectV.Convert(field.FieldType.Elem()))
|
fieldValue.Elem().Set(reflectV.Convert(fieldType))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -520,7 +521,7 @@ func (field *Field) setupValuerAndSetter() {
|
|||||||
err = setter(value, v)
|
err = setter(value, v)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("failed to set value %+v to field %v", v, field.Name)
|
return fmt.Errorf("failed to set value %+v to field %s", v, field.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user