关联

属于

qianmoQqianmoQ· 更新于 2026-09-23· 阅读 5 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

属于(Belongs To)

belongs to 关联在两个模型之间建立一对一的关系,声明该关系的每个实例都"属于"另一个模型的一个实例。

例如,如果您的应用程序包含用户和公司,且每个用户只能被分配到一家公司,那么以下类型表示了这种关系。请注意,User 对象上既有 CompanyID,也有 Company。默认情况下,CompanyID 被隐式用于在 User 表和 Company 表之间创建外键关系,因此必须包含在 User 结构体中,以便填充 Company 内部结构体。


type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company
}

type Company struct {
  ID   int
  Name string
}

有关填充内部结构体的详细信息,请参阅 预加载。

覆盖外键

要定义属于关系,必须存在外键,默认外键使用所有者的类型名称加上其主字段名称。

对于上面的示例,要定义属于 Company 的 User 模型,按约定外键应为 CompanyID。

GORM 提供了一种自定义外键的方法,例如:

type User struct {
  gorm.Model
  Name         string
  CompanyRefer int
  Company      Company `gorm:"foreignKey:CompanyRefer"`
  
}

type Company struct {
  ID   int
  Name string
}

覆盖引用

对于属于关系,GORM 通常使用所有者的主字段作为外键的值,对于上面的示例,就是 Company 的 ID 字段。

当您将用户分配给公司时,GORM 会将公司的 ID 保存到用户的 CompanyID 字段中。

您可以使用 references 标签来更改它,例如:

type User struct {
  gorm.Model
  Name      string
  CompanyID string
  Company   Company `gorm:"references:Code"` 
}

type Company struct {
  ID   int
  Code string
  Name string
}

注意 如果覆盖的外键名称已存在于所有者类型中,GORM 通常会将关系猜测为 has one,我们需要在 belongs to 关系中指定 references。

type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company `gorm:"references:CompanyID"` 
}

type Company struct {
  CompanyID   int
  Code        string
  Name        string
}

属于关系的增删改查

请查看 关联模式 以了解如何处理属于关系。

预加载

GORM 允许通过 Preload 或 Joins 预加载属于关联,详细信息请参阅 预加载(Eager loading)。

外键约束

您可以使用 constraint 标签设置 OnUpdate、OnDelete 约束,这些约束将在使用 GORM 进行迁移时创建,例如:

type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}

type Company struct {
  ID   int
  Name string
}

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…