例如,我在資料庫中有兩個具有 One2Many 關系的表。
考慮下一段代碼(型別直接來自檔案,幾乎沒有變化):
package main
import (
"github.com/davecgh/go-spew/spew"
"github.com/gofrs/uuid"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type Email struct {
ID uuid.UUID `gorm:"primary_key;type:char(36);"`
Address string `gorm:"unique"`
Uid uuid.UUID
}
type User struct {
ID uuid.UUID `gorm:"primary_key;type:char(36);"`
Name string `gorm:"unique"`
Emails []Email `gorm:"ForeignKey:Uid"`
}
func main() {
var err error
var db *gorm.DB
db, err = gorm.Open(mysql.New(mysql.Config{
DSN: "root:AsdfgH123@tcp(localhost:3306)/maindb?charset=utf8&parseTime=True&loc=Local",
}), &gorm.Config{})
if err != nil {
panic(err)
}
if err != nil {
panic(err)
}
err = db.AutoMigrate(
&User{},
&Email{})
if err != nil {
panic(err)
}
uid1, _ := uuid.NewV7()
uid2, _ := uuid.NewV7()
eid1, _ := uuid.NewV7()
eid2, _ := uuid.NewV7()
users := []User{
{Name: "user_1", ID: uid1, Emails: []Email{{ID: eid1, Address: "[email protected]"}}},
{Name: "user_2", ID: uid2, Emails: []Email{{ID: eid2, Address: "[email protected]"}}},
}
db.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&users)
dbUsers := []User{}
db.Preload("Emails", "address like 'user_1@%'").Find(&dbUsers)
spew.Dump(dbUsers)
}
結果我得到了這個:
([]main.User) (len=2 cap=20) {
(main.User) {
ID: (uuid.UUID) (len=16 cap=16) 01833180-a4f4-7663-a73e-798b110724ed,
Name: (string) (len=6) "user_1",
Emails: ([]main.Email) (len=1 cap=10) {
(main.Email) {
ID: (uuid.UUID) (len=16 cap=16) 01833180-a4f4-70e6-ad25-c5726212a97c,
Address: (string) (len=18) "[email protected]",
Uid: (uuid.UUID) (len=16 cap=16) 01833180-a4f4-7663-a73e-798b110724ed
}
}
},
(main.User) {
ID: (uuid.UUID) (len=16 cap=16) 01833180-a4f4-738f-ad46-1c7bb36cf79c,
Name: (string) (len=6) "user_2",
Emails: ([]main.Email) (cap=10) {
}
}
}
我可以根據不是空串列dbUsers的事實過濾結果。user.Emails但是是否有可能純粹使用 GORM 來做到這一點?讓 GORM 只回傳帶有請求的電子郵件的用戶Preload?
uj5u.com熱心網友回復:
我認為你應該能夠使用子查詢來解決這個問題。抱歉,我無法針對 mysql 資料庫運行它,所以它未經測驗,但我想你會明白要點:
subQuery := db.Select("uid").Where("address like 'user_1@%'").Table("emails")
db.Where("id IN (?)", subQuery).Find(&dbUsers)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508654.html
標籤:去戈戈姆
上一篇:使用GoFiber中間件的AWSCognitoJWT驗證(獲取“密鑰型別無效”)
下一篇:一道題開始認識Symbol
