1 一对一
User 与 另一个模型CreditCard 建立一对一的关联
(1) 基本使用
User 有一张 CreditCard,默认的外键名是UserID
type User struct {
gorm.Model
//
CreditCard CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
可以使用标签 foreignKey 来更改 默认的外键名
type User struct {
gorm.Model
CreditCard CreditCard `gorm:"foreignKey:UserName"`
}
type CreditCard struct {
gorm.Model
Number string
UserName string // 使用 UserName 作为外键
}
(2) 自引用
type User struct {
gorm.Model
Name string
ManagerID *uint
Manager *User
}
2 一对多
User与 另一个模型CreditCard 建立了一对多的连接。
(1) 基本使用
User 有多张 CreditCard
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint // UserID 是默认的外键字段
}
(2) 自引用
一个用户管理着一堆用户
type User struct {
gorm.Model
Name string
ManagerID *uint
Team []User `gorm:"foreignkey:ManagerID"`
}
3 多对多
(1) 基本使用
一个 user 可以说多种 language, 一种 language也可以被多个user说
// User 拥有并属于多种 language,`user_languages` 是连接表
// 当使用 GORM 的 AutoMigrate 为 User 创建表时,GORM 会自动创建连接表
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
// 下面的字段属于反向引用, 用不到可以不写
Users []*User `gorm:"many2many:user_languages;"`
}
(2) 自引用
每个用户 可能有多个好朋友
type User struct {
gorm.Model
Friends []*User `gorm:"many2many:user_friends"`
}
(3) 自定义连接表
注意: 自定义连接表要求外键是复合主键或复合唯一索引
type Person struct {
ID int
Name string
Addresses []Address `gorm:"many2many:person_addresses;"`
}
type Address struct {
ID uint
Name string
}
type PersonAddress struct {
PersonID int `gorm:"primaryKey"`
AddressID int `gorm:"primaryKey"`
CreatedAt time.Time
DeletedAt gorm.DeletedAt
}
func (PersonAddress) BeforeCreate(db *gorm.DB) error {
// ...
}
// 修改 Person 的 Addresses 字段的连接表为 PersonAddress
// PersonAddress 必须定义好所需的外键,否则会报错
err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})