我是 golang 和 Gorm 的新手
這是我的結構
type SonModel struct {
ID int64
Age int
Name string
FatherID int64
Father FaterModel `gorm:"foreignKey:ID;references:FatherID"`
}
type FaterModel struct {
ID int64
Name string
GrandID int64
Grand GrandModel `gorm:"foreignKey:ID;references:GrandID"`
}
type GrandModel struct {
ID int64
Name string
}
在原始 sql 中,我想要的是
select son.id,son.name,to_json(father.*) father from son join father on father.id = son.father_id where (son.name like '%name%' or father.name like '%name%') and son.age = 15
我想加入并與父親一起過濾
在 gorm 我正在做的是
db = db.Joins("Father").Preload("Father.Grand")
db = db.Joins("left join father on father.id = son.id left join grand on grand.id = father.grand_id")
db = db.Where("age = ?",15)
db = db.Where("father.name like ? or son.name like ? or grand.name like ?",name)
我發現它離開加入父親和大兩次
首先加入父親作為父親讓父親的列
發送是我的自定義左加入我
如何才能加入(“父親”)一次并使用其列進行過濾
uj5u.com熱心網友回復:
假設您想堅持使用這些結構名稱,則需要做幾件事。
首先,按照慣例,GORM 根據結構名稱確定表名稱。如果要使用不同的名稱,則需要Tabler為每個模型實作介面。像這樣的東西:
func (SonModel) Table() string {
return "son"
}
func (FaterModel) Table() string {
return "father"
}
func (GrandModel) Table() string {
return "grand"
}
完成此操作后,您可以像這樣撰寫查詢:
var sons []SonModel
name = fmt.Sprintf("%%%s%%", name) //for example, output in the resulting query should be %John%
err := db.Preload("Father.Grand").
Joins("left join father on father.id = son.father_id").
Joins("left join grand on grand.id = father.grand_id").
Where("sone.age = ?", 15).
Where("son.name like ? or father.name like ? or grand.name like ?", name, name, name).
Find(&sons).Error
uj5u.com熱心網友回復:
我試試這個代碼
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Model(&SonModel{}).Select("son.id, son.name, father.*").Joins("left join father on father.id = son.id").Where("son.name LIKE ?", "%name%").Where("father.name LIKE ?", "%name%").Where("age = ?", 15).Scan(&SonModel{})
})
fmt.Println(sql)
結果
SELECT son.id, son.name, father.* FROM "son_models" left join father on father.id = son.id WHERE son.name LIKE '%name%' AND father.name LIKE '%name%' AND age = 15
這能解決你的問題嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375341.html
