首頁 >後端開發 >Golang >如何在GORM中有效率地查詢關聯實體?

如何在GORM中有效率地查詢關聯實體?

Susan Sarandon
Susan Sarandon原創
2024-12-29 08:56:11760瀏覽

How to Efficiently Query Associated Entities in GORM?

GORM Golang 中的關聯

在Go 中,利用GORM ORM,在查詢多個相關資訊的實體時會出現一個常見的挑戰。讓我們深入研究一個範例來說明這個問題。

考慮代表城鎮及其相關地點的結構:

type Place struct {
  ID          int
  Name        string
  Town        Town
}

type Town struct {
  ID   int
  Name string
}

假設資料庫包含以下範例資料:

places table towns Table
id name town_id id name
1 Place1 1 1 Town1
2 Place2 1 2 Town2

要檢索所有地點及其對應的城鎮,可以嘗試以下操作查詢:

db := gorm.Open("sqlite3", "./data.db")
defer db.Close()
places := []Place{}
db.Find(&places)

但是,結果將產生:

[{1 Place1 {0 }} {2 Mares Place2 {0 }}]

請注意,缺少相應的城鎮資訊.為了修正這個問題,我們需要將Place 結構中的外鍵指定為TownID:

type Place struct {
  ID          int
  Name        string
  Description string
  TownID      int
  Town        Town
}

要獲得預期結果,可以選擇以下方法:

db.Find(&places)
for i, _ := range places {
    db.Model(places[i]).Related(&places[i].Town)
}

這確實會產生期望的結果,但它會遇到n 1 問題,因為它會為每個位置觸發額外的資料庫查詢。

更多有效的解決方案涉及利用預先載入:

db.Preload("Town").Find(&places)

這種簡潔的方法會產生以下最佳化的資料庫查詢:

SELECT  * FROM "places"
[0.92ms]  SELECT  * FROM "towns"  WHERE ("id" in ('1'))

透過利用預先加載,我們確保在單一中檢索相關的城鎮資訊資料庫查詢,從而優化效能並消除n 1 問題。

以上是如何在GORM中有效率地查詢關聯實體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn