屬於:可以理解為舔狗認為自己屬於女神,而女神都不知道舔狗的存在
type Girl struct { Id int Name string } type Dog struct { Id int Name string GirlId int Girl Girl } 遷移 schema db.AutoMigrate(&Dog{}) //此時會將Girl和Dog都生成
擁有:可以理解為女神知道舔狗的存在,舔狗只需要留一根「狗鏈子」在女神建立的時候交給女神就好了
type Dog struct { Id int Name string GirlId int } type Girl struct { Id int Name string Dog Dog } //db.AutoMigrate(&Girl{}) //只有一個Girl表生成 db.AutoMigrate(&Girl{}, &Dog{}) d := Dog{Id: 1, Name: "haha0"} db.Create(&Girl{Id: 1, Name: "nv0", Dog: d}) //此時Dog中的GirlId欄位被自動填寫
var girl Girl db.First(&girl, 1) fmt.Println(girl)
直接這樣查是不行的,這是需要先預載入
改成:db.Preload("Dog").First(&girl, 1)
//給舔狗建立關係
db.Model(&Girl{Id:1}).Association("Dog").Append(&dog)
上面是hasone的情況,belong to 的情況正好相反
Append換為Delete,是刪除連線
換為Replace(&g1,&g2),是替換連線
Clear(),自身去掉所有關係
還是上面的例子只需要微微改動
` type Dog struct {
Id int
Name string
GirlId int
//Girl Girl
}
type Girl struct {
Id int
Name string
Dogs []Dog
}
d0 := Dog{Id: 1,
Name: "haha0"}
d1 := Dog{Id: 2,
Name: "haha2"}
g := &Girl{Id: 1,
Name: "nv0",
Dogs: []Dog{d0, d1},
}
db.Create(&g)
db.AutoMigrate(&Girl{}, &Dog{})
`
查詢:db.Preload("Dogs").First(&girl)
還是預載入,需要如果條件判斷
db.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users WHERE state = 'active';
// SELECT * FROM orders WHERE user_id IN (1,2) AND state NOT IN ('cancelled');
`
db.Preload("Orders", func(db *gorm.DB) *gorm.DB { return db.Order("orders.amount DESC") }).Find(&users) // SELECT * FROM users; // SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;
type Info struct { Id int money int GogId int } type Dog struct { Id int Name string GirlId int //Girl Girl Info Info }
注意 Join適用於一對一的關係,例如: has one, belongs to
上面的問題可以:
db.Preload("Dogs", func(db *gorm.DB) *gorm.DB {
return db.Joins("Info").Where("money>200")
}).First(&girl)
建立格式:
type Info struct { Id int Money int DogId int } type Girl struct { Id int Name string Dogs []Dog
gorm:"many2many:girl_dog"} type Dog struct { Id int Name string Girl []Girl
gorm:"many2many:girl_dog" Info Info }
查詢
1.只想查舔狗的女神有哪些,不要舔狗資訊
2.舔狗資訊也要,就加上預載入
想加條件和一對多差不多
關係維護
還是那幾個函數
刪除最好用事務
最後
注意多對多情況的FK和refer和一對一/多正好相反了
部落格是觀看b站up主(go圈裡最會寫js的奇淼)筆記
連結:https://www.bilibili.com/video/BV1E64y1472a?p=10&spm_id_from=pageDriver&vd_source=7de631e1910751f66cb6a72edf044dab