You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1.4 KiB

Polymorphism Polymorphism Association GORM supports polymorphism association for has one and has many, it will save owned entity’s table name into polymorphic type’s field, primary key value into the polymorphic field

By default polymorphic: will prefix the column type and column id with . The value will be the table name pluralized.

type Dog struct { ID int Name string Toys []Toy gorm:"polymorphic:Owner;" }

type Toy struct { ID int Name string OwnerID int OwnerType string }

db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}}) // INSERT INTO dogs (name) VALUES ("dog1") // INSERT INTO toys (name,owner_id,owner_type) VALUES ("toy1",1,"dogs"), ("toy2",1,"dogs") You can specify polymorphism properties separately using the following GORM tags:

polymorphicType: Specifies the column type. polymorphicId: Specifies the column ID. polymorphicValue: Specifies the value of the type. type Dog struct { ID int Name string Toys []Toy gorm:"polymorphicType:Kind;polymorphicId:OwnerID;polymorphicValue:master" }

type Toy struct { ID int Name string OwnerID int Kind string }

db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}}) // INSERT INTO dogs (name) VALUES ("dog1") // INSERT INTO toys (name,owner_id,kind) VALUES ("toy1",1,"master"), ("toy2",1,"master") In these examples, we’ve used a has-many relationship, but the same principles apply to has-one relationships.