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 = ...
这怎么可能?我需要使用“手动”查询吗?
--
如果不可能:什么是良好实践/指南,如何建模我的关系,以便我可以有效地使用 .Preload() 等 GORM 内置函数?
例如如果我这样放置用户和文档之间的关系:
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
结构中的 User
和 User
结构中的 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)
我想知道是否可以从关系的双方预加载数据。考虑这个例子:
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 = ...
这怎么可能?我需要使用“手动”查询吗?
--
如果不可能:什么是良好实践/指南,如何建模我的关系,以便我可以有效地使用 .Preload() 等 GORM 内置函数?
例如如果我这样放置用户和文档之间的关系:
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
结构中的 User
和 User
结构中的 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)