一对多关系

一对多关系

与“一对一”关系不同,“一对多”关系与另一个模型建立了一对多连接,拥有者可以拥有零个或多个模型实例。

例如,如果您的应用程序包含用户和信用卡,并且每个用户可以有多张信用卡。

声明

// User has many CreditCards, UserID is the foreign key
type User struct {
gorm.Model
CreditCards []CreditCard
}

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

检索

// Retrieve user list with eager loading credit cards
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"}}})
// INSERT INTO `dogs` (`name`) VALUES ("dog1")
// INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","dogs"), ("toy2","1","dogs")

您可以使用标签“多态值”更改多态类型值,例如:

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"}}})
// INSERT INTO `dogs` (`name`) VALUES ("dog1")
// INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","master"), ("toy2","1","master")

使用一对多关系进行增删改查

请查看关联模式以了解如何使用一对多关系。

预加载

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
}

您还可以在删除时使用“选择”删除选定的一对多关联,有关详细信息,请查看使用选择删除

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商