一架梯子,一头程序猿,仰望星空!

GORM 关联查询 - 一对多关系(Has Many)


GORM的关联查询(又叫连表查询)中的Has Many关系是一对多关联关系,通常用于描述一个Model拥有多个Model。

例子

一个用户拥有多张信用卡,下面以Go Struct表示表结构

// 用户
type User struct {
  // 继承gorm的基础Model,里面默认定义了ID、CreatedAt、UpdatedAt、DeletedAt 4个字段
  gorm.Model
  CreditCards []CreditCard // 一对多关联属性,表示多张信用卡
}

// 信用卡
type CreditCard struct {
  gorm.Model
  Number   string // 卡号
  UserID  uint // 默认外键, 用户Id
}

外键

默认情况下,GORM使用持有关联属性的 类型名 + 主键ID 作为外键名。

如上例,User使用User + ID = UserID 作为外键名。

自定义外键

type User struct {
  gorm.Model
  // 通过标签,将外键定义为:UserRefer
  CreditCards []CreditCard `gorm:"foreignkey:UserRefer"`
}

type CreditCard struct {
  gorm.Model
  Number    string
  UserRefer uint // 新定义的外键名
}

关联外键

外键和关联外键都是成对出现的,默认情况GORM使用主键ID,作为关联外键。

主键ID,默认为ID,如上面的例子,使用User的ID作为关联外键

自定义关联外键

type User struct {
  gorm.Model
  MemberNumber string // 关联外键字段
  // 使用references定义关联外键名
  CreditCards  []CreditCard `gorm:"foreignkey:UserMemberNumber;references:MemberNumber"`
}

type CreditCard struct {
  gorm.Model
  Number           string
  UserMemberNumber string // 外键字段
}

一对多关联查询例子

user := User{}
// 查询用户数据
//自动生成sql: SELECT * FROM `users`  WHERE (username = 'tizi365') LIMIT 1
db.Where("username = ?", "tizi365").First(&user)
fmt.Println(user)

//自动生成SQL: SELECT * FROM emails WHERE user_id = 111; // 111 是user的主键ID值
// 关联查询的结果,保存到user.CreditCard属性
db.Model(&user).Association("CreditCard").Find(&user.CreditCard)