網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例_Golang
作者:Jeff的技術(shù)棧 ? 更新時(shí)間: 2022-06-15 編程語(yǔ)言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)系并將其填充到變量 // 如果字段名與變量的類(lèi)型名相同,如上例所示,可以省略,如: 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. 多對(duì)多
// 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)屬性和多對(duì)多顯式不支持,并且會(huì)拋出錯(cuò)誤。
1.6. 關(guān)聯(lián)模式
關(guān)聯(lián)模式包含一些幫助方法來(lái)處理關(guān)系事情很容易。
// 開(kāi)始關(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()
原文鏈接:https://www.cnblogs.com/guyouyin123/p/14115312.html
相關(guān)推薦
- 2023-01-17 CMakeList中自動(dòng)編譯protobuf文件過(guò)程_C 語(yǔ)言
- 2022-10-01 Go語(yǔ)言異步API設(shè)計(jì)的扇入扇出模式詳解_Golang
- 2022-11-19 Golang切片Slice功能操作詳情_(kāi)Golang
- 2022-06-20 C語(yǔ)言簡(jiǎn)明講解隊(duì)列的實(shí)現(xiàn)方法_C 語(yǔ)言
- 2022-03-18 Android?Activity生命周期調(diào)用的理解_Android
- 2022-01-08 關(guān)于git操作warning: adding embedded git repository: pp
- 2022-02-11 element ui table 內(nèi)嵌 input 調(diào)用 focus 方法無(wú)效
- 2022-05-12 tp5使用阿里云oss存儲(chǔ)圖片
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支