【GORM】模型关系-HasMany关系

一、概述
  • HasMany与另一个模型建立一对多的连接,拥有者可以拥有零个或多个关联模型。
二、模型建立

​ 依旧以UserCreditCard为例,一个User可以拥有多张CreditCardHasMany关系模型的实现主要在拥有者模型中定义。

1. 拥有者模型
  • 实现HasMany模型,拥有者需要拥有以下字段:

    (1) 外键:默认为被拥有者的主键,在被拥有者模型中定义,在被拥有者模型切片变量中标注。

    (2) 引用:默认为拥有者的主键,在拥有者模型中定义,在被拥有者模型切片变量中标注。

    (3) 被拥有者模型切片变量;

  • 以下是拥有者模型User的定义:

    CreditCard模型中的UserID作为外键,以ID作为索引(默认)。

    type User struct {
    	ID          uint `gorm:"primary_key"`
    	Name        string
    	Password    string       `gorm:"<-;->:false"`
    	CreditCards []CreditCard `gorm:"foreignKey:UserID;references:ID"`
    }
    
2. 被拥有者模型(关联模型)
  • 实现HasMany模型,被拥有者按照正常的逻辑定义,必要时可以添加拥有者模型的外键,如上User模型中使用CreditCard模型中的UserID变量作为外键。

  • 与上User对应的CreditCard模型如下:

    type CreditCard struct {
    	ID     uint `gorm:"primary_key"`
    	UserID uint `gorm:"->:false;<-"`
    	Number string
    }
    
三、相关操作
1. 创建
  • 定义完整的实例对象,调用Save方法保存。
func TestSaveUser() {
   user := User{
      Name:     "Jason",
      Password: "123",
      CreditCards: []CreditCard{
         {Number: "1234567890"},
         {Number: "0987654321"},
      },
   }

   err := SaveUser(user)
   if err != nil {
      log.Println("用户保存失败!")
   } else {
      log.Println("用户保存成功!")
   }
}
func SaveUser(user User) error {
   var err error
   err = db.Save(&user).Error
   return err
}
2. 查询
  • 需要加载关联模型,使用Preload方法。
func GetUserByName(name string) (User, error) {
   var user User
   var err error
   err = db.Where("name = ?", name).Preload("CreditCards").First(&user).Error
   return user, err
}
3. 添加关联模型实例
  • 向已有的记录添加关联模型实例,如向已有的User记录添加CreditCard记录。
func AppendCardByUser(user User, card CreditCard) error {
   var err error
   err = db.Model(&user).Association("CreditCards").Append(&card)
   return err
}

​ 其中Association方法的参数为要添加的关联模型类型,对应关联模型的切片变量名。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值