forked from mirror/gorm
Allow to omit fields when upsert associations, close #3762
This commit is contained in:
parent
54b80b18bc
commit
a1a30c38de
|
@ -67,7 +67,7 @@ func SaveBeforeAssociations(db *gorm.DB) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if elems.Len() > 0 {
|
if elems.Len() > 0 {
|
||||||
if saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, nil), elems.Interface()) == 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))
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ func SaveBeforeAssociations(db *gorm.DB) {
|
||||||
rv = rv.Addr()
|
rv = rv.Addr()
|
||||||
}
|
}
|
||||||
|
|
||||||
if saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, nil), rv.Interface()) == nil {
|
if saveAssociations(db, rel, rv.Interface(), selectColumns, restricted, nil) == nil {
|
||||||
setupReferences(db.Statement.ReflectValue, rv)
|
setupReferences(db.Statement.ReflectValue, rv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
||||||
}
|
}
|
||||||
|
|
||||||
saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, assignmentColumns), elems.Interface())
|
saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, assignmentColumns)
|
||||||
}
|
}
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
if _, zero := rel.Field.ValueOf(db.Statement.ReflectValue); !zero {
|
if _, zero := rel.Field.ValueOf(db.Statement.ReflectValue); !zero {
|
||||||
|
@ -162,7 +162,7 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
||||||
}
|
}
|
||||||
|
|
||||||
saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, assignmentColumns), f.Interface())
|
saveAssociations(db, rel, f.Interface(), selectColumns, restricted, assignmentColumns)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
|
||||||
}
|
}
|
||||||
|
|
||||||
saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, assignmentColumns), elems.Interface())
|
saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, assignmentColumns)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
|
|
||||||
if elems.Len() > 0 {
|
if elems.Len() > 0 {
|
||||||
if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
|
if v, ok := selectColumns[rel.Name+".*"]; !ok || v {
|
||||||
saveAssociations(db, selectColumns, rel.Name, onConflictOption(db.Statement, rel.FieldSchema, nil), elems.Interface())
|
saveAssociations(db, rel, elems.Interface(), selectColumns, restricted, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < elems.Len(); i++ {
|
for i := 0; i < elems.Len(); i++ {
|
||||||
|
@ -302,10 +302,14 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func onConflictOption(stmt *gorm.Statement, s *schema.Schema, defaultUpdatingColumns []string) clause.OnConflict {
|
func onConflictOption(stmt *gorm.Statement, s *schema.Schema, selectColumns map[string]bool, restricted bool, defaultUpdatingColumns []string) clause.OnConflict {
|
||||||
if stmt.DB.FullSaveAssociations {
|
if stmt.DB.FullSaveAssociations {
|
||||||
defaultUpdatingColumns = make([]string, 0, len(s.DBNames))
|
defaultUpdatingColumns = make([]string, 0, len(s.DBNames))
|
||||||
for _, dbName := range s.DBNames {
|
for _, dbName := range s.DBNames {
|
||||||
|
if v, ok := selectColumns[dbName]; (ok && !v) || (!ok && restricted) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if !s.LookUpField(dbName).PrimaryKey {
|
if !s.LookUpField(dbName).PrimaryKey {
|
||||||
defaultUpdatingColumns = append(defaultUpdatingColumns, dbName)
|
defaultUpdatingColumns = append(defaultUpdatingColumns, dbName)
|
||||||
}
|
}
|
||||||
|
@ -331,9 +335,12 @@ func onConflictOption(stmt *gorm.Statement, s *schema.Schema, defaultUpdatingCol
|
||||||
return clause.OnConflict{DoNothing: true}
|
return clause.OnConflict{DoNothing: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
func saveAssociations(db *gorm.DB, selectColumns map[string]bool, refName string, onConflict clause.OnConflict, values interface{}) error {
|
func saveAssociations(db *gorm.DB, rel *schema.Relationship, values interface{}, selectColumns map[string]bool, restricted bool, defaultUpdatingColumns []string) error {
|
||||||
var selects, omits []string
|
var (
|
||||||
refName = refName + "."
|
selects, omits []string
|
||||||
|
onConflict = onConflictOption(db.Statement, rel.FieldSchema, selectColumns, restricted, defaultUpdatingColumns)
|
||||||
|
refName = rel.Name + "."
|
||||||
|
)
|
||||||
|
|
||||||
for name, ok := range selectColumns {
|
for name, ok := range selectColumns {
|
||||||
columnName := ""
|
columnName := ""
|
||||||
|
|
Loading…
Reference in New Issue