第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Gorm 中的 Preload 函數(shù)有什么作用?

Gorm 中的 Preload 函數(shù)有什么作用?

Go
弒天下 2023-08-14 16:37:04
我無法理解這個(gè)函數(shù)的作用。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)有人能解釋一下這兩個(gè)語句會(huì)做什么嗎?輸出會(huì)是什么?是preload用來緩存結(jié)果的嗎?
查看完整描述

1 回答

?
慕工程0101907

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ù)。


我希望這有幫助。



查看完整回答
反對 回復(fù) 2023-08-14
  • 1 回答
  • 0 關(guān)注
  • 231 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號