关联

一对多

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

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

一对多(Has Many)

一对多关联为两个模型建立一对多的连接,与 一对一 不同,拥有方可以拥有零个或多个模型实例。

例如,如果您的应用包含用户和信用卡,每个用户可以拥有许多信用卡。

声明


type User struct {
  gorm.Model
  CreditCards []CreditCard
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}

查询


func GetAll(db *gorm.DB) ([]User, error) {
    var users []User
    err := db.Model(&User{}).Preload("CreditCards").Find(&users).Error
    return users, err
}

重写外键

要定义 一对多 关系,必须存在一个外键。默认外键的名称是拥有方的类型名加上其主键字段名。

例如,要定义一个属于 User 的模型,外键应该为 UserID。

要使用其他字段作为外键,可以通过 foreignKey 标签进行自定义,例如:

type User struct {
  gorm.Model
  CreditCards []CreditCard `gorm:"foreignKey:UserRefer"`
}

type CreditCard struct {
  gorm.Model
  Number    string
  UserRefer uint
}

重写引用

GORM 通常使用拥有方的主键作为外键的值,在上面的例子中,就是 User 的 ID,

当您将信用卡分配给用户时,GORM 会将用户的 ID 保存到信用卡的 UserID 字段中。

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

type User struct {
  gorm.Model
  MemberNumber string
  CreditCards  []CreditCard `gorm:"foreignKey:UserNumber;references:MemberNumber"`
}

type CreditCard struct {
  gorm.Model
  Number     string
  UserNumber string
}

一对多关系的增删改查

有关处理一对多关系,请参阅 关联模式

预加载

GORM 允许使用 Preload 预加载一对多关联,详情请参阅 预加载(Eager loading)

自引用一对多

type User struct {
  gorm.Model
  Name      string
  ManagerID *uint
  Team      []User `gorm:"foreignkey:ManagerID"`
}

外键约束

您可以通过 constraint 标签设置 OnUpdate、OnDelete 约束,它们会在使用 GORM 进行迁移时创建,例如:

type User struct {
  gorm.Model
  CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}

您还可以在删除时使用 Select 删除选定的一对多关联,详情请参阅 带 Select 的删除

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…