1 一对一

User 与 另一个模型CreditCard 建立一对一的关联

(1) 基本使用

User 有一张 CreditCard,默认的外键名是UserID

  1. type User struct {
  2. gorm.Model
  3. //
  4. CreditCard CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
  5. }
  6. type CreditCard struct {
  7. gorm.Model
  8. Number string
  9. UserID uint
  10. }

可以使用标签 foreignKey 来更改 默认的外键名

  1. type User struct {
  2. gorm.Model
  3. CreditCard CreditCard `gorm:"foreignKey:UserName"`
  4. }
  5. type CreditCard struct {
  6. gorm.Model
  7. Number string
  8. UserName string // 使用 UserName 作为外键
  9. }

(2) 自引用

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. ManagerID *uint
  5. Manager *User
  6. }

2 一对多

User与 另一个模型CreditCard 建立了一对多的连接。

(1) 基本使用

User 有多张 CreditCard

  1. type User struct {
  2. gorm.Model
  3. CreditCards []CreditCard
  4. }
  5. type CreditCard struct {
  6. gorm.Model
  7. Number string
  8. UserID uint // UserID 是默认的外键字段
  9. }

(2) 自引用

一个用户管理着一堆用户

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. ManagerID *uint
  5. Team []User `gorm:"foreignkey:ManagerID"`
  6. }

3 多对多

多对多 会在两个 model 中添加一张连接表。

(1) 基本使用

一个 user 可以说多种 language, 一种 language也可以被多个user说

  1. // User 拥有并属于多种 language,`user_languages` 是连接表
  2. // 当使用 GORM 的 AutoMigrate 为 User 创建表时,GORM 会自动创建连接表
  3. type User struct {
  4. gorm.Model
  5. Languages []Language `gorm:"many2many:user_languages;"`
  6. }
  7. type Language struct {
  8. gorm.Model
  9. Name string
  10. // 下面的字段属于反向引用, 用不到可以不写
  11. Users []*User `gorm:"many2many:user_languages;"`
  12. }

(2) 自引用

每个用户 可能有多个好朋友

  1. type User struct {
  2. gorm.Model
  3. Friends []*User `gorm:"many2many:user_friends"`
  4. }

(3) 自定义连接表

注意: 自定义连接表要求外键是复合主键或复合唯一索引

  1. type Person struct {
  2. ID int
  3. Name string
  4. Addresses []Address `gorm:"many2many:person_addresses;"`
  5. }
  6. type Address struct {
  7. ID uint
  8. Name string
  9. }
  10. type PersonAddress struct {
  11. PersonID int `gorm:"primaryKey"`
  12. AddressID int `gorm:"primaryKey"`
  13. CreatedAt time.Time
  14. DeletedAt gorm.DeletedAt
  15. }
  16. func (PersonAddress) BeforeCreate(db *gorm.DB) error {
  17. // ...
  18. }
  19. // 修改 Person 的 Addresses 字段的连接表为 PersonAddress
  20. // PersonAddress 必须定义好所需的外键,否则会报错
  21. err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})