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

Method buildMany2ManyRelation

schema/relationship.go:271–444  ·  view source on GitHub ↗
(relation *Relationship, field *Field, many2many string)

Source from the content-addressed store, hash-verified

269}
270
271func (schema *Schema) buildMany2ManyRelation(relation *Relationship, field *Field, many2many string) {
272 relation.Type = Many2Many
273
274 var (
275 err error
276 joinTableFields []reflect.StructField
277 fieldsMap = map[string]*Field{}
278 ownFieldsMap = map[string]*Field{} // fix self join many2many
279 referFieldsMap = map[string]*Field{}
280 joinForeignKeys = toColumns(field.TagSettings["JOINFOREIGNKEY"])
281 joinReferences = toColumns(field.TagSettings["JOINREFERENCES"])
282 )
283
284 ownForeignFields := schema.PrimaryFields
285 refForeignFields := relation.FieldSchema.PrimaryFields
286
287 if len(relation.foreignKeys) > 0 {
288 ownForeignFields = []*Field{}
289 for _, foreignKey := range relation.foreignKeys {
290 if field := schema.LookUpField(foreignKey); field != nil {
291 ownForeignFields = append(ownForeignFields, field)
292 } else {
293 schema.err = fmt.Errorf("invalid foreign key: %s", foreignKey)
294 return
295 }
296 }
297 }
298
299 if len(relation.primaryKeys) > 0 {
300 refForeignFields = []*Field{}
301 for _, foreignKey := range relation.primaryKeys {
302 if field := relation.FieldSchema.LookUpField(foreignKey); field != nil {
303 refForeignFields = append(refForeignFields, field)
304 } else {
305 schema.err = fmt.Errorf("invalid foreign key: %s", foreignKey)
306 return
307 }
308 }
309 }
310
311 for idx, ownField := range ownForeignFields {
312 joinFieldName := cases.Title(language.Und, cases.NoLower).String(schema.Name) + ownField.Name
313 if len(joinForeignKeys) > idx {
314 joinFieldName = cases.Title(language.Und, cases.NoLower).String(joinForeignKeys[idx])
315 }
316
317 ownFieldsMap[joinFieldName] = ownField
318 fieldsMap[joinFieldName] = ownField
319 joinTableFields = append(joinTableFields, reflect.StructField{
320 Name: joinFieldName,
321 PkgPath: ownField.StructField.PkgPath,
322 Type: ownField.StructField.Type,
323 Tag: removeSettingFromTag(appendSettingFromTag(ownField.StructField.Tag, "primaryKey"),
324 "column", "autoincrement", "index", "unique", "uniqueindex"),
325 })
326 }
327
328 for idx, relField := range refForeignFields {

Callers 1

parseRelationMethod · 0.95

Calls 9

LookUpFieldMethod · 0.95
toColumnsFunction · 0.85
removeSettingFromTagFunction · 0.85
appendSettingFromTagFunction · 0.85
ParseFunction · 0.85
copyableDataTypeFunction · 0.85
NewMethod · 0.65
JoinTableNameMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected