在官网的实体关联底部有一个表格,讲的是关联标签
标签 |
描述 |
foreignKey |
指定当前模型的列作为连接表的外键 |
references |
指定引用表的列名,其将被映射为连接表外键 |
polymorphic |
指定多态类型,比如模型名 |
polymorphicValue |
指定多态值、默认表名 |
many2many |
指定连接表表名 |
joinForeignKey |
指定连接表的外键列名,其将被映射到当前表 |
joinReferences |
指定连接表的外键列名,其将被映射到引用表 |
constraint |
关系约束,例如:OnUpdate 、OnDelete |
关联标签可以自定义创建关联的时候,使用哪些列作为外键之类的(
其中有几个已经讲过了,然后最后一个一般不用,剩下的 4 个再挑出来讲一讲
foreignKey
与 references
还是用老师学生举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package main
type Info struct { Id int Score int
StudentID int }
type Student struct { Id int Name string Info Info
TeacherID int }
type Teacher struct { Id int Name string
Student []Student }
func hasMany() { GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{}, &Info{})
student1 := Student{Name: "student1"} student2 := Student{Name: "student2"}
teacher1 := Teacher{ Name: "teacher1", Student: []Student{ student1, student2, }, }
GLOBAL_DB.Create(&teacher1)
}
|

这里是用 TeacherID 作为外键,使用 foreignKey
与 references
标签指定其他的列为外键
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| type Student struct { Id int Name string Info Info
TeacherName string }
type Teacher struct { Id int Name string
Student []Student `gorm:"foreignKey:TeacherName;references:Name"` }
|
这个标签的意思是说:在其他模型中使用 TeacherName
作为外键,其值是本模型中的 Name

joinForeignKey
与 joinReferences
上面的例子是在 has many 中,而在 many to many 中,如果要重写外键,最好加上这两个标签
joinForeignKey
指定关联表字段
joinReferences
指定关联表引用
其实就是手动指定关联表中的列名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package main
type Student struct { Id int StudentName string `gorm:"index:,unique"`
Teachers []Teacher `gorm:"many2many:student_teachers;foreignkey:StudentName;joinForeignKey:student_name;references:TeacherName;joinreferences:teacher_name"` }
type Teacher struct { Id int TeacherName string `gorm:"index:,unique"`
Students []Student `gorm:"many2many:student_teachers;foreignkey:TeacherName;joinForeignKey:teacher_name;references:StudentName;joinreferences:student_name"` }
func many2many() { GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{})
teacher1 := Teacher{TeacherName: "teacher1"} teacher2 := Teacher{TeacherName: "teacher2"} student1 := Student{ StudentName: "student1", Teachers: []Teacher{teacher1, teacher2}, } GLOBAL_DB.Create(&student1)
}
|
