Голанг ГОРМ имеет много отношений - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть 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"`
}

Я хочу получить пользователя по первичному идентификатору, а также собрать активы.

Следуя документации здесь: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)

Как правильно обрабатывать отношения в этом случае?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Функция 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
}
0 голосов
/ 13 декабря 2018

Я тоже так пытался, основываясь на документах, и не смог заставить его работать.

В конечном итоге у меня сработала функция Preload () на БД.

Вотпример из моего кода:

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