一对多关系
与“一对一”关系不同,“一对多”关系与另一个模型建立了一对多连接,拥有者可以拥有零个或多个模型实例。
例如,如果您的应用程序包含用户和信用卡,并且每个用户可以有多张信用卡。
声明
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 }
|
覆盖外键
要定义“一对多”关系,必须存在外键。默认外键的名称是拥有者的类型名称加上其主键字段的名称。
例如,要定义属于“用户”的模型,外键应该是“用户 ID”。
要使用另一个字段作为外键,可以使用“外键”标签对其进行自定义,例如:
type User struct { gorm.Model CreditCards []CreditCard `gorm:"foreignKey:UserRefer"` }
type CreditCard struct { gorm.Model Number string UserRefer uint }
|
覆盖引用
GORM 通常使用拥有者的主键作为外键的值,对于上面的示例,它是“用户”的“ID”。
当您将信用卡分配给用户时,GORM 会将用户的“ID”保存到信用卡的“用户 ID”字段中。
您可以使用标签“引用”来更改它,例如:
type User struct { gorm.Model MemberNumber string CreditCards []CreditCard `gorm:"foreignKey:UserNumber;references:MemberNumber"` }
type CreditCard struct { gorm.Model Number string UserNumber string }
|
多态关联
GORM 支持“一对一”和“一对多”的多态关联,它会将拥有的实体的表名保存到多态类型的字段中,将主键值保存到多态字段中。
type Dog struct { ID int Name string Toys []Toy `gorm:"polymorphic:Owner;"` }
type Toy struct { ID int Name string OwnerID int OwnerType string }
db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
|
您可以使用标签“多态值”更改多态类型值,例如:
type Dog struct { ID int Name string Toys []Toy `gorm:"polymorphic:Owner;polymorphicValue:master"` }
type Toy struct { ID int Name string OwnerID int OwnerType string }
db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
|
使用一对多关系进行增删改查
请查看关联模式以了解如何使用一对多关系。
预加载
GORM 允许使用“预加载”预加载一对多关联,有关详细信息,请参阅预加载(渴望加载)。
自引用一对多关系
type User struct { gorm.Model Name string ManagerID *uint Team []User `gorm:"foreignkey:ManagerID"` }
|
外键约束
您可以使用标签“约束”设置“更新时”、“删除时”约束,它将在使用 GORM 迁移时创建,例如:
type User struct { gorm.Model CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"` }
type CreditCard struct { gorm.Model Number string UserID uint }
|
您还可以在删除时使用“选择”删除选定的一对多关联,有关详细信息,请查看使用选择删除。