天天看點

【GORM】模型關系-HasMany關系

一、概述

  • HasMany

    與另一個模型建立一對多的連接配接,擁有者可以擁有零個或多個關聯模型。

二、模型建立

​ 依舊以

User

CreditCard

為例,一個

User

可以擁有多張

CreditCard

HasMany

關系模型的實作主要在擁有者模型中定義。

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

方法的參數為要添加的關聯模型類型,對應關聯模型的切片變量名。