Golang GORM有很多关系

Golang GORM有很多关系,go,go-gorm,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 `go

我有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获得一个用户,并收集资产

遵循此处的文档:我执行了以下操作,虽然有记录,但它为我提供了一个空数组:

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)
致:

我检索单个资产,因为出于某种原因,GORM是通过资产id而不是用户id进行检索的。(因此,如果用户_id为10,则它将获得资产_id->10的资产)


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

基于文档,我也尝试过这种方法,但无法使其正常工作

最终对我有效的是db上的Preload()函数

下面是我的一些代码中的一个示例:

err := GetDB().Preload("Ingredients").Find(&flavors).Error

基于文档,我也尝试过这种方法,但无法使其正常工作

最终对我有效的是db上的Preload()函数

下面是我的一些代码中的一个示例:

err := GetDB().Preload("Ingredients").Find(&flavors).Error
Preload()func可用于直接加载链接。关于给定代码的更新:

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
}
Preload()func可用于直接加载链接。关于给定代码的更新:

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
}

这不是答案,只是更新。

也许你提到的问题是一个bug,现在已经修复了。以下模式对我来说没有任何问题

r.DB.Model(&user).Related(&user.Assets)

但与您的模式有一点不同,我没有明确提到
gorm:“foreignkey:user\u id”
。常见的命名约定是自动完成工作。

这不是答案,只是更新。

也许你提到的问题是一个bug,现在已经修复了。以下模式对我来说没有任何问题

r.DB.Model(&user).Related(&user.Assets)

但与您的模式有一点不同,我没有明确提到
gorm:“foreignkey:user\u id”
。常见的命名惯例就是自动完成这项工作。

这很有帮助