在官网的实体关联底部有一个表格,讲的是关联标签

标签 描述
foreignKey 指定当前模型的列作为连接表的外键
references 指定引用表的列名,其将被映射为连接表外键
polymorphic 指定多态类型,比如模型名
polymorphicValue 指定多态值、默认表名
many2many 指定连接表表名
joinForeignKey 指定连接表的外键列名,其将被映射到当前表
joinReferences 指定连接表的外键列名,其将被映射到引用表
constraint 关系约束,例如:OnUpdateOnDelete

关联标签可以自定义创建关联的时候,使用哪些列作为外键之类的(

其中有几个已经讲过了,然后最后一个一般不用,剩下的 4 个再挑出来讲一讲


foreignKeyreferences

还是用老师学生举例

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

// has many
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)

}

image-20221009233002262

这里是用 TeacherID 作为外键,使用 foreignKeyreferences 标签指定其他的列为外键

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

// has many
Student []Student `gorm:"foreignKey:TeacherName;references:Name"`
}

这个标签的意思是说:在其他模型中使用 TeacherName 作为外键,其值是本模型中的 Name

image-20221009234059913


joinForeignKeyjoinReferences

上面的例子是在 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"`

// many2many
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"`

// many2many
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)

//var student = Student{Id: 1}
//var result []Teacher
//GLOBAL_DB.Model(&student).Preload("Students").Association("Teachers").Find(&result)
//fmt.Println(result)
}

image-20221010091433814