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

GORM 关联查询-属于


GORM的关联查询(又叫连表查询)中的属于关系是一对一关联关系的一种,通常用于描述一个Model属于另外一个Model。

例子

存在一个users表和profiles表:

  • users - 用户表
  • profiles - 用户个性化信息表

他们之间存在一对一关系,每一个用户都有自己的个性化数据,那么可以说每一条profiles记录都属于某个用户。

// 用户表 - 下面使用go struct表示表结构
type User struct {
  // 继承gorm的基础Model,里面默认定义了ID、CreatedAt、UpdatedAt、DeletedAt 4个字段
  gorm.Model
  Name string
}

// 个性化信息表
type Profile struct {
  gorm.Model
  UserID uint // 外键
  // 定义user属性关联users表,默认情况使用 类型名 + ID 组成外键名,在这里UserID属性就是外键
  User   User
  Name   string
}

外键

在关联查询中必须包含外键,默认gorm使用(关联属性类型 + 主键)组成外键名,如上面的例子User + ID 组成UserID,UserID就作为Profile的外键。

也可以通过下面方式修改外键

type Profile struct {
  gorm.Model
  Name      string
  User      User `gorm:"foreignkey:UserRefer"` //使用 UserRefer 作为外键
  UserRefer uint // 外键
}

关联外键

在连表操作中,除了外键,还需要一个关联外键组成一对才能完成连表,例如上面的例子,Profile中UserID属性作为外键,它和User中的ID进行关联,这里User的ID就是关联外键。

默认GORM使用主键作为关联外键,所以上面的User使用ID作为关联外键。

也可以自定义关联外键

type User struct {
  gorm.Model
  Refer string // 关联外键
  Name string
}

type Profile struct {
  gorm.Model
  Name      string
  User      User `gorm:"references:Refer"` // 使用 Refer 作为关联外键
  UserRefer string
}

属于关联查询例子

profile := Profile{}
// 查询用户个性数据
//自动生成sql: SELECT * FROM `profiles` WHERE id = 1 AND `profiles`.`deleted_at` IS NULL LIMIT 1
db.Where("id = ?", 1).Take(&profile)
fmt.Println(profile)

user := User{}
// 通过Profile关联查询user数据, 查询结果保存到user变量
db.Model(&profile).Association("User").Find(&user)
fmt.Println(user)
// 自动生成sql: SELECT * FROM `users` WHERE `users`.`id` = 1 // 1 就是user的 ID,已经自动关联