例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。

重写外键

对于 has one 关系,同样必须存在外键字段。拥有者将把属于它的模型的主键保存到这个字段。

这个字段的名称通常由 has one 模型的类型加上其 主键 生成,对于上面的例子,它是 UserID

如果你想要使用另一个字段来保存该关系,你同样可以使用标签 foreignKey 来更改它,例如:

  1. type User struct {
  2. gorm.Model
  3. CreditCard CreditCard `gorm:"foreignKey:UserName"`
  4. // 使用 UserName 作为外键
  5. }
  6. type CreditCard struct {
  7. Number string
  8. UserName string
  9. }

默认情况下,拥有者实体会将 has one 对应模型的主键保存为外键,您也可以修改它,用另一个字段来保存,例如下个这个使用 来保存的例子。

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

多态关联

  1. type Cat struct {
  2. ID int
  3. Name string
  4. Toy Toy `gorm:"polymorphic:Owner;"`
  5. }
  6. type Dog struct {
  7. ID int
  8. Name string
  9. Toy Toy `gorm:"polymorphic:Owner;"`
  10. }
  11. type Toy struct {
  12. ID int
  13. Name string
  14. OwnerID int
  15. }
  16. db.Create(&Dog{Name: "dog1", Toy: Toy{Name: "toy1"}})
  17. // INSERT INTO `dogs` (`name`) VALUES ("dog1")
  18. // INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","dogs")

您可以使用标签 polymorphicValue 来更改多态类型的值,例如:

查看 关联模式 获取 has one 相关的用法

预加载

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

  1. type User struct {
  2. gorm.Model
  3. Name string
  4. ManagerID *uint
  5. }

外键约束

你也可以在删除记录时通过 来删除关联的记录,查看 Delete with Select 获取详情