1. Has Many

1.1. 一对多

has many 关联就是创建和另一个模型的一对多关系, 不像 has one,所有者可以拥有0个或多个模型实例。

例如,如果你的应用包含用户和信用卡, 并且每一个用户都拥有多张信用卡。

  1. // 用户有多张信用卡,UserID 是外键
  2. type User struct {
  3. gorm.Model
  4. CreditCards []CreditCard
  5. }
  6. type CreditCard struct {
  7. gorm.Model
  8. Number string
  9. UserID uint
  10. }

1.2. 外键

为了定义一对多关系, 外键是必须存在的,默认外键的名字是所有者类型的名字加上它的主键。

就像上面的例子,为了定义一个属于User 的模型,外键就应该为 UserID

使用其他的字段名作为外键, 你可以通过 foreignkey 来定制它, 例如:

  1. type User struct {
  2. gorm.Model
  3. CreditCards []CreditCard `gorm:"foreignkey:UserRefer"`
  4. }
  5. type CreditCard struct {
  6. gorm.Model
  7. Number string
  8. UserRefer uint
  9. }

1.3. 外键关联

GORM 通常使用所有者的主键作为外键的值, 在上面的例子中,它就是 UserID

当你分配信用卡给一个用户, GORM 将保存用户 ID 到信用卡表的 UserID 字段中。

你能通过 association_foreignkey 来改变它, 例如:

  1. type User struct {
  2. gorm.Model
  3. MemberNumber string
  4. CreditCards []CreditCard `gorm:"foreignkey:UserMemberNumber;association_foreignkey:MemberNumber"`
  5. }
  6. type CreditCard struct {
  7. gorm.Model
  8. Number string
  9. UserMemberNumber string
  10. }

1.4. 多态关联

支持多态的一对多和一对一关联。

  1. type Cat struct {
  2. ID int
  3. Name string
  4. Toy []Toy `gorm:"polymorphic:Owner;"`
  5. }
  6. type Dog struct {
  7. ID int
  8. Name string
  9. Toy []Toy `gorm:"polymorphic:Owner;"`
  10. }
  11. type Toy struct {
  12. ID int
  13. Name string
  14. OwnerID int
  15. OwnerType string
  16. }

注意:多态属于和多对多是明确不支持并会抛出错误的。

1.5. 使用一对多

你可以通过Related 找到 has many 关联关系。

  1. db.Model(&user).Related(&emails)
  2. //// SELECT * FROM emails WHERE user_id = 111; // 111 是用户表的主键

更多高级用法, 请参考 Association Mode