教程 > gorm 教程 > 阅读:42

gorm has many——迹忆客-ag捕鱼王app官网

has many 与另一个模型建立了一对多的连接。 不同于 has one,拥有者可以有零或多个关联模型。

例如,我们的应用包含 user 和 credit card 模型,且每个 user 可以有多张 credit card。

声明

// user 有多张 creditcard,userid 是外键
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
}

重写外键

要定义 has many 关系,同样必须存在外键。 默认的外键名是拥有者的类型名加上其主键字段名

例如,要定义一个属于 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 字段。

为 user 添加 credit card 时,gorm 会将 user 的 id 字段保存到 credit card 的 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 为 has onehas many 提供了多态关联支持,它会将拥有者实体的表名、主键都保存到多态类型的字段中。

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")

我们可以使用标签 polymorphicvalue 来更改多态类型的值,例如:

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")

has many 的 curd

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


预加载

gorm 可以通过 preload 预加载 has many 关联的记录。


自引用 has many

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 来删除 has many 关联的记录。

查看笔记

扫码一下
查看教程更方便
网站地图