Gorm 四种关联模式

1,186 阅读2分钟

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语言框架