我有2个简单的实体,用户有很多资产:
type User struct {
UserId int `gorm:"PRIMARY_KEY"`
Email string `gorm:"column:email"`
FirstName string `gorm:"column:firstname"`
LastName string `gorm:"column:lastname"`
Assets []Asset `gorm:"foreignkey:user_id"`
}
type Asset struct {
AssetId int `gorm:"PRIMARY_KEY"`
UserId int `gorm:"column:user_id"`
Slug string `gorm:"column:slug"`
Address string `gorm:"address"`
}
我想通过主要ID吸引用户并收集资产。
按照此处的文档进行操作:http://doc.gorm.io/associations.html#has-many我执行了以下操作,尽管有记录,但仍给我一个空数组:
var user app.User
var assets []app.Asset
err := r.DB.Where("user_id = ?", userId).First(&user).Error
if err != nil {
return nil, err
}
r.DB.Model(&user).Related(&assets)
更改自:
r.DB.Model(&user).Related(&assets)
收件人:
r.DB.Model(&user).Related(&user.Assets)
我检索单个资产是因为出于某种原因,GORM是通过asset_id而不是通过user_id进行检索的。 (因此,如果user_id为10,则它将获得具有asset_id-> 10的资产)
在这种情况下处理关系的正确方法是什么?
答案 0 :(得分:1)
我也根据文档尝试了这种方法,但无法使其正常工作。
最终对我有用的是数据库上的Preload()函数。
这是我的一些代码示例:
err := GetDB().Preload("Ingredients").Find(&flavors).Error
答案 1 :(得分:0)
Preload()函数可用于直接加载链接。更新给出的代码:
var user app.User
var assets []app.Asset
err := r.DB.Where("user_id = ?", userId).Preload("Assets").First(&user).Error
if err != nil {
return nil, err
}
答案 2 :(得分:0)
这不是答案,只是更新。
也许您提到的问题是一个错误,现在已经修复。以下模式对我来说毫无问题。
r.DB.Model(&user).Related(&user.Assets)
但是与您的架构略有不同,我没有明确提及gorm:"foreignkey:user_id"
。只是常见的命名约定是自动完成这项工作。