簡體   English   中英

GORM ORM:可以在兩個關系方向上預加載嗎?

[英]GORM ORM: Preloading in both relationship directions possible?

我想知道是否可以從關系的雙方預加載數據。 考慮這個例子:

type User struct {
    gorm.Model
    Name      string
    Documents []Document // has-many
}
type Document struct {
    gorm.Model
    UserID           uint
    Name             string
    DocumentFulltext DocumentFulltext // has-one
}
type DocumentFulltext struct {
    gorm.Model
    DocumentID uint
    Name       string
}

有了它,我可以輕松獲取任何給定文檔的 DocumentFulltext 像這樣

db.Where("id = ?", ID).Preload("DocumentFulltext").Find(&document)

作品!

但是,如果我有文檔並想要預加載(或加入)它所屬的用戶怎么辦?

db.Where("id = ?", ID).Preload("User").Find(&document)

這讓我感到恐慌。 invalid memory address

db.Where("id = ?", ID).Joins("User").Find(&document)

這會產生不穩定的 SQL ,例如.... FROM "documents" User WHERE id =...

這怎么可能? 我需要使用“手動”查詢嗎?

--

如果不可能:什么是良好實踐/指南如何 model 我的關系,以便我可以有效地使用 GORM 內置插件 like.Preload()?

例如,如果我將用戶和文檔之間的關系如下:

type User struct {
    gorm.Model
    Name string
}
type Document struct {
    gorm.Model
    User             User // belongs-to
    UserID           uint
    Name             string
    DocumentFulltext DocumentFulltext // has-one
}
type DocumentFulltext struct {
    gorm.Model
    DocumentID uint
    Name       string
}

然后我可以為任何給定的文檔預加載 DocumentFulltext 和 User。 但是如果我想為給定的用戶做預加載文檔和全文的能力,我會失去它。

--

任何提示都值得贊賞。 謝謝!

使用關系雙方意味着Document結構中的UserUser結構中的Documents

type User struct {
    gorm.Model
    Name      string
    Documents []Document // has-many
}

type Document struct {
    gorm.Model
    UseredID uint
    Name     string
    User   User
}

然后你可以預加載雙方

db.Debug().Where("id = ?", ID).Preload("User").Find(&document)
db.Debug().Where("id = ?", ID).Preload("Documents").Find(&user)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM