学习和使用GORM已经有了一段时间,记录一下关于many2many的关联创建。
先看一下结构定义:
type Student struct {
gorm.Model
Code string `gorm:"index;unique;"`// 学生编码或者叫学号
Name string // 学生名称
}
type Teacher struct {
gorm.Model
Code string `gorm:"index;unique;"`// 教师编码
Name string // 教师名称
}
需求:使用学号和教师编码建立多对多的关联关系。
使用官方的双向引用,代码如下:
type Student struct {
gorm.Model
Code string `gorm:"index;unique;"`
Name string
Teachers []*Teacher `gorm:"many2many:stu_tea;"`
}
type Teacher struct {
gorm.Model
Code string `gorm:"index;unique;"`
Name string
Students []*Student `gorm:"many2many:stu_tea;"`
}
这样创建出来的关联关系是使用两个表的各自主键ID创建的,不与需求符合。
尝试了使用foreignKey和references来设定关联字段,在自动迁移Automigrate时,创建的关联表都不能以学生编码和老师编码作为关联,所以不能满足需求。注意:如果是单向引用,可以满足需求的。
如何既满足双向引用,又满足使用自定义字段作为关联的关系设定呢?
目前我的方法是手动设定关联关系表,且是使用hasMany的方式来实现的,既学生表与关系表是hasMany的关系,教师表与关系表也是hasMany的关系。代码如下:
type Student struct {
gorm.Model
Code string `gorm:"index;unique;"`
Name string
StuTeaRSs []*StuTeaRS `gorm:"foreignKey:StuCode;"`
}
type Teacher struct {
gorm.Model
Code string `gorm:"index;unique;"`
Name string
StuTeaRSs []*StuTeaRS `gorm:"foreignKey:TeaCode;"`
}
type StuTeaRS struct {
gorm.Model
StuCode string
TeaCode string
}
不知道有没有更好的办法,如果有,麻烦有缘人指点迷津,不胜感激!