1. Belongs To
belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都 “属于” 另一个模型的一个实例。
例如,每一个用户都属于一个公司,对于用户而言,他belongs to公司。
type User struct {
gorm.Model
Name string
CompanyRefer int
Company Company `gorm:"foreignKey:CompanyRefer;references:Code"`
}
type Company struct {
ID int
Code int
Name string
}
- foreignKey:指明外键是本结构中的那个字段,默认为外表名+主键
- references:指明外键引用了外表的那个字段,默认为主键
2. Has One
has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。
例如,每个人都有一张身份证,并且只有一张。
type User struct {
gorm.Model
ID int
Name string `sql:"index"`
IDCard IDCard `gorm:"foreignKey:UserName;references:name"`
}
type IDCard struct {
gorm.Model
Number string
UserName string
}
- foreignKey:指明IDCard结构的外键是本结构中的那个字段,默认为本表名+主键
- references:指明IDCard结构的外键是本结构中的那个字段,默认为主键
3. Has Many
has many 与另一个模型建立了一对多的连接。 不同于 has one,拥有者可以有零或多个关联模型。
例如,每个人都可以有很多张信用卡。
type User struct {
gorm.Model
MemberNumber string
CreditCards []CreditCard `gorm:"foreignKey:UserNumber;references:MemberNumber"`
}
type CreditCard struct {
gorm.Model
Number string
UserNumber string
}
多态关联
GORM 为 has one 和 has many 提供了多态关联支持,它会将拥有者实体的表名、主键都保存到多态类型的字段中。
type Dog struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;"`
}
type Cat struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;"`
}
type Toy struct {
ID int
Name string
OwnerID int
OwnerType string
}
如下图所示,Cat与Dog的ID都可以指向Toy的OwnerID字段。
classDiagram
Toy <|-- Cat
Toy <|-- Dog
class Toy{
+int OwnerID
}
class Cat{
+ID int
}
class Dog{
+ID int
}
4. Many To Many
Many to Many 会在两个 model 中添加一张连接表。
例如,一个人可能属于多个组织,每个组织也包括很多个人。
type User struct {
gorm.Model
Profiles []Profile `gorm:"many2many:user_profiles;foreignKey:Refer;joinForeignKey:UserReferID;References:UserRefer;joinReferences:ProfileRefer"`
Refer uint `gorm:"index:,unique"`
}
type Profile struct {
gorm.Model
Name string
UserReferID uint `gorm:"index:,unique"`
}
// 这会创建连接表:user_profiles
// 外键: user_refer_id, 引用: users.refer
// 外键: profile_refer, 引用: profiles.user_refer
本文正在参加技术专题18期-聊聊Go语言框架