亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gorm 中的 Preload 函數有什么作用?

Gorm 中的 Preload 函數有什么作用?

Go
弒天下 2023-08-14 16:37:04
我無法理解這個函數的作用。type User struct {? gorm.Model? Username string? Orders Order}type Order struct {? gorm.Model? UserID uint? Price float64}db.Preload("Username")db.Preload("Orders").Find(&users)有人能解釋一下這兩個語句會做什么嗎?輸出會是什么?是preload用來緩存結果的嗎?
查看完整描述

1 回答

?
慕工程0101907

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)

只需上面的代碼,您現在就可以訪問數據庫中不同表中的用戶數據。


我希望這有幫助。



查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號