golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例
1. 關(guān)聯(lián)
1.1. 屬于
// `User`屬于`Profile`, `ProfileID`為外鍵
type User struct {
gorm.Model
Profile Profile
ProfileID int
}
type Profile struct {
gorm.Model
Name string
}
db.Model(&user).Related(&profile)
//// SELECT * FROM profiles WHERE id = 111; // 111是user的外鍵ProfileID
指定外鍵
type Profile struct {
gorm.Model
Name string
}
type User struct {
gorm.Model
Profile Profile `gorm:"ForeignKey:ProfileRefer"` // 使用ProfileRefer作為外鍵
ProfileRefer int
}
指定外鍵和關(guān)聯(lián)外鍵
type Profile struct {
gorm.Model
Refer string
Name string
}
type User struct {
gorm.Model
Profile Profile `gorm:"ForeignKey:ProfileID;AssociationForeignKey:Refer"`
ProfileID int
}
1.2. 包含一個(gè)
// User 包含一個(gè) CreditCard, UserID 為外鍵
type User struct {
gorm.Model
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
UserID uint
Number string
}
var card CreditCard
db.Model(&user).Related(&card, "CreditCard")
//// SELECT * FROM credit_cards WHERE user_id = 123; // 123 is user's primary key
// CreditCard是user的字段名稱,這意味著獲得user的CreditCard關(guān)系并將其填充到變量
// 如果字段名與變量的類型名相同,如上例所示,可以省略,如:
db.Model(&user).Related(&card)
指定外鍵
type Profile struct {
gorm.Model
Name string
UserRefer uint
}
type User struct {
gorm.Model
Profile Profile `gorm:"ForeignKey:UserRefer"`
}
指定外鍵和關(guān)聯(lián)外鍵
type Profile struct {
gorm.Model
Name string
UserID uint
}
type User struct {
gorm.Model
Refer string
Profile Profile `gorm:"ForeignKey:UserID;AssociationForeignKey:Refer"`
}
1.3. 包含多個(gè)
// User 包含多個(gè) emails, UserID 為外鍵
type User struct {
gorm.Model
Emails []Email
}
type Email struct {
gorm.Model
Email string
UserID uint
}
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 是 user 的主鍵
指定外鍵
type Profile struct {
gorm.Model
Name string
UserRefer uint
}
type User struct {
gorm.Model
Profiles []Profile `gorm:"ForeignKey:UserRefer"`
}
指定外鍵和關(guān)聯(lián)外鍵
type Profile struct {
gorm.Model
Name string
UserID uint
}
type User struct {
gorm.Model
Refer string
Profiles []Profile `gorm:"ForeignKey:UserID;AssociationForeignKey:Refer"`
}
1.4. 多對多
// User 包含并屬于多個(gè) languages, 使用 `user_languages` 表連接
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
db.Model(&user).Related(&languages, "Languages")
//// SELECT * FROM "languages" INNER JOIN "user_languages" ON "user_languages"."language_id" = "languages"."id" WHERE "user_languages"."user_id" = 111
指定外鍵和關(guān)聯(lián)外鍵
type CustomizePerson struct {
IdPerson string `gorm:"primary_key:true"`
Accounts []CustomizeAccount `gorm:"many2many:PersonAccount;ForeignKey:IdPerson;AssociationForeignKey:IdAccount"`
}
type CustomizeAccount struct {
IdAccount string `gorm:"primary_key:true"`
Name string
}
譯者注:這里設(shè)置好像缺失一部分
1.5. 多種包含
支持多種的包含一個(gè)和包含多個(gè)的關(guān)聯(lián)
type Cat struct {
Id int
Name string
Toy Toy `gorm:"polymorphic:Owner;"`
}
type Dog struct {
Id int
Name string
Toy Toy `gorm:"polymorphic:Owner;"`
}
type Toy struct {
Id int
Name string
OwnerId int
OwnerType string
}
注意:多態(tài)屬性和多對多顯式不支持,并且會(huì)拋出錯(cuò)誤。
1.6. 關(guān)聯(lián)模式
關(guān)聯(lián)模式包含一些幫助方法來處理關(guān)系事情很容易。
// 開始關(guān)聯(lián)模式
var user User
db.Model(&user).Association("Languages")
// `user`是源,它需要是一個(gè)有效的記錄(包含主鍵)
// `Languages`是關(guān)系中源的字段名。
// 如果這些條件不匹配,將返回一個(gè)錯(cuò)誤,檢查它:
// db.Model(&user).Association("Languages").Error
// Query - 查找所有相關(guān)關(guān)聯(lián)
db.Model(&user).Association("Languages").Find(&languages)
// Append - 添加新的many2many, has_many關(guān)聯(lián), 會(huì)替換掉當(dāng)前 has_one, belongs_to關(guān)聯(lián)
db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN})
db.Model(&user).Association("Languages").Append(Language{Name: "DE"})
// Delete - 刪除源和傳遞的參數(shù)之間的關(guān)系,不會(huì)刪除這些參數(shù)
db.Model(&user).Association("Languages").Delete([]Language{languageZH, languageEN})
db.Model(&user).Association("Languages").Delete(languageZH, languageEN)
// Replace - 使用新的關(guān)聯(lián)替換當(dāng)前關(guān)聯(lián)
db.Model(&user).Association("Languages").Replace([]Language{languageZH, languageEN})
db.Model(&user).Association("Languages").Replace(Language{Name: "DE"}, languageEN)
// Count - 返回當(dāng)前關(guān)聯(lián)的計(jì)數(shù)
db.Model(&user).Association("Languages").Count()
// Clear - 刪除源和當(dāng)前關(guān)聯(lián)之間的關(guān)系,不會(huì)刪除這些關(guān)聯(lián)
db.Model(&user).Association("Languages").Clear()以上就是golang gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于golang gorm的關(guān)系關(guān)聯(lián)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解
結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實(shí)現(xiàn)方法2021-09-09
Golang實(shí)現(xiàn)字符串倒序的幾種解決方案
給定一個(gè)字符串,按單詞將該字符串逆序是我們大家在開發(fā)中可能會(huì)遇到的一個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于Golang如何實(shí)現(xiàn)字符串倒序的幾種解決方案,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
Go使用Gin+mysql實(shí)現(xiàn)增刪改查的詳細(xì)實(shí)例
golang本身沒有提供連接mysql的驅(qū)動(dòng),但是定義了標(biāo)準(zhǔn)接口供第三方開發(fā)驅(qū)動(dòng),下面這篇文章主要給大家介紹了關(guān)于Go使用Gin+mysql實(shí)現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下2022-12-12
go語言題解LeetCode1122數(shù)組的相對排序
這篇文章主要為大家介紹了go語言題解LeetCode1122數(shù)組的相對排序,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

