1 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
您提供的鏈接顯示了它的作用。您只需要實(shí)際閱讀頁面上的信息即可。
首先,這并沒有真正做任何事情:
db.Preload("Username")
另一方面,如下:
db.Preload("Orders").Find(&users)
確實(shí)做某事。首先它填充users,然后它填充[]user.Orders。在您鏈接的頁面上的評論中,您會(huì)發(fā)現(xiàn)這一點(diǎn),其中顯示了它通過查詢執(zhí)行的操作:
db.Preload("Orders").Find(&users)
//// SELECT * FROM users;
//// SELECT * FROM orders WHERE user_id IN (1,2,3,4);
那么這到底有什么作用呢?我可以給你技術(shù)答案,你可以通過谷歌搜索急切加載輕松找到答案,或者我可以通過例子給你一個(gè)答案,我覺得更簡單。
讓我通過例子來解釋這一點(diǎn)。
假設(shè)您有用戶,每個(gè)用戶可以有多個(gè)訂單。這是一對多的關(guān)系,可以這樣定義:
type User struct {
gorm.Model
Username string
Orders []Order
}
當(dāng)您users像這樣填充切片時(shí):
db.Find(&users)
//// SELECT * FROM users;
如果您需要獲取每個(gè)用戶的所有訂單,您可以輕松訪問user.Orders,但無論如何這都是空的,因?yàn)樗鼪]有被填充。
如果我們users像這樣填充切片:
db.Preload("Orders").Find(&users)
將由user.Orders該用戶的訂單填充。這是一個(gè)使處理關(guān)系變得更容易的抽象。
丑陋的選擇是:
db.Find(&users)
for user := range users {
db.Where("user_id", user.id).Find(&user.Orders)
}
它還會(huì)向數(shù)據(jù)庫發(fā)出不必要的更多請求。(這不好)
如果您的用戶有帖子、評論和訂單,那么您可以像這樣定義和查詢它:
type User struct {
gorm.Model
Username string
Orders []Order
Comments []Comment
Posts []Post
}
db.Preload("Orders").Preload("Comments").Preload("Posts").Find(&users)
只需上面的代碼,您現(xiàn)在就可以訪問數(shù)據(jù)庫中不同表中的用戶數(shù)據(jù)。
我希望這有幫助。
- 1 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報(bào)