Golang GORM有很多关系

时间:2018-12-13 17:09:10

标签: go go-gorm

我有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的资产)

在这种情况下处理关系的正确方法是什么?

3 个答案:

答案 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"。只是常见的命名约定是自动完成这项工作。