Belongs To

belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。

例如,您的应用包含 user 和 company,并且每个 user 都可以分配给一个 company

  1. // `User` 属于 `Company`,`CompanyID` 是外键
  2. type User struct {
  3. gorm.Model
  4. Name string
  5. CompanyID int
  6. Company Company
  7. }
  8. type Company struct {
  9. ID int
  10. Name string
  11. }

重写外键

要定义一个 belongs to 关系,必须存在外键,默认的外键使用拥有者的类型名加上主字段名

对于上面例子,定义属于 CompanyUser,其外键一般是 CompanyID

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

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. CompanyRefer int
  5. Company Company `gorm:"foreignKey:CompanyRefer"`
  6. // 使用 CompanyRefer 作为外键
  7. }
  8. type Company struct {
  9. ID int
  10. Name string
  11. }

重写引用

对于 belongs to 关系,GORM 通常使用拥有者的主字段作为外键的值。 对于上面的例子,它是 CompanyID 字段

当您将 user 分配给某个 company 时,GORM 会将 company 的 ID 保存到用户的 CompanyID 字段

此外,您也可以使用标签 references 手动更改它,例如:

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. CompanyID string
  5. Company Company `gorm:"references:Code"` // 使用 Code 作为引用
  6. }
  7. type Company struct {
  8. ID int
  9. Code string
  10. Name string
  11. }

Belongs to 的 CRUD

查看 关联模式 获取 belongs to 相关的用法

预加载

GORM 可以通过 PreloadJoins 预加载 belongs to 关联的记录,查看 预加载 获取详情

外键约束

你可以通过标签 constraint 并带上 OnUpdateOnDelete 实现外键约束,例如:

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. CompanyID int
  5. Company Company `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
  6. }
  7. type Company struct {
  8. ID int
  9. Name string
  10. }