所属关系

所属关系

belongs to 关联关系建立与另一个模型的一对一连接,以便声明模型的每个实例“属于”另一个模型的一个实例。

例如,如果您的应用程序包含用户和公司,并且每个用户可以分配到一个公司,则以下类型表示该关系。请注意,在 User 对象上,同时存在 CompanyIDCompany。默认情况下,CompanyID 被隐式用于在 UserCompany 表之间创建外键关系,因此必须包含在 User 结构体中才能填充 Company 内部结构体。

// `User` belongs to `Company`, `CompanyID` is the foreign key
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}

type Company struct {
ID int
Name string
}

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

覆盖外键

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

对于上面的示例,要定义属于 CompanyUser 模型,按照惯例,外键应为 CompanyID

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

type User struct {
gorm.Model
Name string
CompanyRefer int
Company Company `gorm:"foreignKey:CompanyRefer"`
// use CompanyRefer as foreign key
}

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"` // use Code as references
}

type Company struct {
ID int
Code string
Name string
}

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

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

type Company struct {
CompanyID int
Code string
Name string
}

使用所属关系进行 CRUD 操作

请查看关联模式以了解如何使用所属关系

预加载

GORM 允许使用 PreloadJoins 预加载所属关系,有关详细信息,请参阅预加载(渴望加载)

外键约束

您可以使用标签 constraint 设置 OnUpdateOnDelete 约束,它将在使用 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
}

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商