1 回答

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