MCPcopy
hub / github.com/go-gorm/gorm / SaveAfterAssociations

Function SaveAfterAssociations

callbacks/associations.go:110–358  ·  view source on GitHub ↗
(create bool)

Source from the content-addressed store, hash-verified

108}
109
110func SaveAfterAssociations(create bool) func(db *gorm.DB) {
111 return func(db *gorm.DB) {
112 if db.Error == nil && db.Statement.Schema != nil {
113 selectColumns, restricted := db.Statement.SelectAndOmitColumns(create, !create)
114
115 // Save Has One associations
116 for _, rel := range db.Statement.Schema.Relationships.HasOne {
117 if v, ok := selectColumns[rel.Name]; (ok && !v) || (!ok && restricted) {
118 continue
119 }
120
121 switch db.Statement.ReflectValue.Kind() {
122 case reflect.Slice, reflect.Array:
123 var (
124 fieldType = rel.Field.FieldType
125 isPtr = fieldType.Kind() == reflect.Ptr
126 )
127
128 if !isPtr {
129 fieldType = reflect.PointerTo(fieldType)
130 }
131
132 elems := reflect.MakeSlice(reflect.SliceOf(fieldType), 0, 10)
133
134 for i := 0; i < db.Statement.ReflectValue.Len(); i++ {
135 obj := db.Statement.ReflectValue.Index(i)
136
137 if reflect.Indirect(obj).Kind() == reflect.Struct {
138 if _, zero := rel.Field.ValueOf(db.Statement.Context, obj); !zero {
139 rv := rel.Field.ReflectValueOf(db.Statement.Context, obj)
140 if rv.Kind() != reflect.Ptr {
141 rv = rv.Addr()
142 }
143
144 for _, ref := range rel.References {
145 if ref.OwnPrimaryKey {
146 fv, _ := ref.PrimaryKey.ValueOf(db.Statement.Context, obj)
147 db.AddError(ref.ForeignKey.Set(db.Statement.Context, rv, fv))
148 } else if ref.PrimaryValue != "" {
149 db.AddError(ref.ForeignKey.Set(db.Statement.Context, rv, ref.PrimaryValue))
150 }
151 }
152
153 elems = reflect.Append(elems, rv)
154 }
155 }
156 }
157
158 if elems.Len() > 0 {
159 assignmentColumns := make([]string, 0, len(rel.References))
160 for _, ref := range rel.References {
161 assignmentColumns = append(assignmentColumns, ref.ForeignKey.DBName)
162 }
163
164 saveAssociations(db, rel, elems, selectColumns, restricted, assignmentColumns)
165 }
166 case reflect.Struct:
167 if _, zero := rel.Field.ValueOf(db.Statement.Context, db.Statement.ReflectValue); !zero {

Callers 1

RegisterDefaultCallbacksFunction · 0.85

Calls 12

ToStringKeyFunction · 0.92
saveAssociationsFunction · 0.85
SelectAndOmitColumnsMethod · 0.80
MakeSliceMethod · 0.80
LenMethod · 0.80
AppendMethod · 0.80
SessionMethod · 0.80
ClausesMethod · 0.80
AddErrorMethod · 0.65
SetMethod · 0.65
NewMethod · 0.65
CreateMethod · 0.65

Tested by

no test coverage detected