- // User 拥有并属于多种 language,`user_languages` 是连接表
- type User struct {
- gorm.Model
- Languages []Language `gorm:"many2many:user_languages;"`
- }
-
- type Language struct {
- gorm.Model
- Name string
- }
查找所有匹配的关联记录
db.Model(&user).Association("Languages").Find(&languages)
查找带条件的关联
- codes := []string{"zh-CN", "en-US", "ja-JP"}
- db.Model(&user).Where("code IN ?", codes).Association("Languages").Find(&languages)
-
- db.Model(&user).Where("code IN ?", codes).Order("code desc").Association("Languages").Find(&languages)
------------------------------------------------------------------------------------------------------------------------------
使用 Association 方法, 需要把 User 查询好, 然后根据 User 定义中指定AssociationForeignKey 去查找CreditCard。
查询某条数据使用first 查询唯一值
- u := &User{Id: 1}
- db.Debug().First(u)
- fmt.Println(u)
-
- db.Where("id=?",u.Id).First(u)
- import (
- "fmt"
- "gorm.io/driver/mysql"
- "gorm.io/gorm"
- )
-
- type User struct {
- gorm.Model
- UserName string `json:"username" gorm:"column:username"`
- CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
- }
-
- type CreditCard struct {
- gorm.Model
- Number string
- UserID int
- }
-
- func main() {
- dsn6 := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
- db, _ := gorm.Open(mysql.Open(dsn6), &gorm.Config{})
- db.AutoMigrate(&User{}, &CreditCard{})
-
-
-
- //查找 用户名为 lucas 的所有信用卡信息
- u1 := &User{UserName: "lucas"}
-
- //Association必须要先查出User才能关联查询对应的CreditCard
- db.First(u1)
-
- db.Model(u1).Association("CreditCards").Find(&u1.CreditCards)
- fmt.Println(u1)
- }
这里只查找了creditcard
[1.513ms] [rows:2] SELECT * FROM `credit_cards` WHERE `credit_cards`.`user_id` = 1 AND `credit_cards`.`deleted_at` IS NULL
associate是先去获取user,再去获取creditcard !!!!!!!!! var u User db.Debug().Where("name = ?", "lucas").Find(&u) fmt.Println(u) [2.756ms] [rows:1] SELECT * FROM `user` WHERE name = 'lucas' {1 lucas []}// 关联查询的结果,保存到user.CreditCard属性 db.Debug().Model(&u).Association("Articles").Find(&u.Articles) fmt.Println(u) [0.712ms] [rows:2] SELECT * FROM `article` WHERE `article`.`user_id` = 1 {1 lucas [{1 k8s 1 {0 []}} {2 golang 1 {0 []}}]}
- a := make([]Article, 10)
- var u User
- db.Take(&u, 3)
- db.Model(&u).Association("Articles").Find(&a)
- fmt.Println(u)
- fmt.Println(a)
-
- {3 lucas []}
- [{4 golang 3 {0 []}} {5 k8s 3 {0 []}}]
外键设定
一旦能接受新的模式,就可以说一说外键设定了,两个结构体之间相互关联,最直接的想法是我怎么从一个结构体出发然后去获得另一个结构体。
如果我需要通过User去查找它拥有哪些CreditCard, 那么实际上我做的事情 = "拿着User主键去CreditCard表查询".
一旦理解外键是怎么设置的, 我们就可以开始用上外键了, 概念:Association 是一个笼统的工具, 用于管理所有关联关系,以上面的Card&User为例,,我们来管理以上两表之间的关联关系(上面两表,采用默认外键/主键的方式相互关联)
- cs := []CreditCard{}
-
- xiaohan := &User{
- Model:gorm.Model{
- ID:1,
- },
- }
-
- // 所有与xiaohan(id=1)相关联的CreditCard,找出来
- d.Model(xiaohan).Association("CreditCards").Find(&cs)
-
- // xiaohan数据取消与ID=1的CreditCard取消关联
- d.Model(xiaohan).Association("CreditCards").Delete(&CreditCard{
- Model:gorm.Model{
- ID:1,
- },
- })
model 先拿到这张表,然后去连接tags第三张表。之后就是最关键的要去执行什么操作,这个操作可以是delete clean append
// xiaohan与CreditCard之间添加关联
d.Model(xiaohan).Association("Languages").Append(&cards)// 取消所有关联
db.Model(xiaohan).Association("Languages").Clear()// 对象关联计数
db.Model(xiaohan).Association("Languages").Count()