关联
一对多
登录后可跨设备保存划线和私人笔记登录
一对多(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 的删除
评论
登录后参与评论
正在加载评论…
KnowForge