一、概述
-
與另一個模型建立一對多的連接配接,擁有者可以擁有零個或多個關聯模型。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
方法的參數為要添加的關聯模型類型,對應關聯模型的切片變量名。