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.ModelNumber stringUserID uint}
可以使用标签 foreignKey 来更改 默认的外键名
type User struct {gorm.ModelCreditCard CreditCard `gorm:"foreignKey:UserName"`}type CreditCard struct {gorm.ModelNumber stringUserName string // 使用 UserName 作为外键}
(2) 自引用
type User struct {gorm.ModelName stringManagerID *uintManager *User}
2 一对多
User与 另一个模型CreditCard 建立了一对多的连接。
(1) 基本使用
User 有多张 CreditCard
type User struct {gorm.ModelCreditCards []CreditCard}type CreditCard struct {gorm.ModelNumber stringUserID uint // UserID 是默认的外键字段}
(2) 自引用
一个用户管理着一堆用户
type User struct {gorm.ModelName stringManagerID *uintTeam []User `gorm:"foreignkey:ManagerID"`}
3 多对多
(1) 基本使用
一个 user 可以说多种 language, 一种 language也可以被多个user说
// User 拥有并属于多种 language,`user_languages` 是连接表// 当使用 GORM 的 AutoMigrate 为 User 创建表时,GORM 会自动创建连接表type User struct {gorm.ModelLanguages []Language `gorm:"many2many:user_languages;"`}type Language struct {gorm.ModelName string// 下面的字段属于反向引用, 用不到可以不写Users []*User `gorm:"many2many:user_languages;"`}
(2) 自引用
每个用户 可能有多个好朋友
type User struct {gorm.ModelFriends []*User `gorm:"many2many:user_friends"`}
(3) 自定义连接表
注意: 自定义连接表要求外键是复合主键或复合唯一索引
type Person struct {ID intName stringAddresses []Address `gorm:"many2many:person_addresses;"`}type Address struct {ID uintName string}type PersonAddress struct {PersonID int `gorm:"primaryKey"`AddressID int `gorm:"primaryKey"`CreatedAt time.TimeDeletedAt gorm.DeletedAt}func (PersonAddress) BeforeCreate(db *gorm.DB) error {// ...}// 修改 Person 的 Addresses 字段的连接表为 PersonAddress// PersonAddress 必须定义好所需的外键,否则会报错err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})
