Выбор связанных полей с GORM - PullRequest
5 голосов
/ 22 апреля 2019

Я новичок в Golang из Питона, поэтому пытаюсь понять новые и разные концепции. Я пытаюсь создать связанные поля и затем выбрать их из базы данных.

Модель:

type Company struct {
    gorm.Model
    Name string
}

type CreditCard struct {
    gorm.Model
    Number    int
    Company   Company
    CompanyId uint
}

type User struct {
    gorm.Model
    Name         string
    CreditCard   CreditCard
    CreditCardID uint
}

Создание таблиц и строк и выбор из db

common.DB.AutoMigrate(
    &Company{},
    &CreditCard{},
    &User{},
)

user := User{
    Name:       "Alice",
    CreditCard: CreditCard{Number: 123456, Company: Company{Name: "Bank A"}},
}

common.DB.Create(&user)

var retrivedUser User
var creditCard CreditCard
var company Company
common.DB.First(&retrivedUser, 1).Related(&creditCard).Related(&company)

fmt.Println("user name", retrivedUser.Name)
fmt.Println("creditcard number", retrivedUser.CreditCard.Number)
fmt.Println("creditcard number related", creditCard.Number)
fmt.Println("company name", retrivedUser.CreditCard.Company.Name)
fmt.Println("company name related", company.Name)

Это печатает:

user name Alice
creditcard number 0
creditcard number related 123456
company name 
company name related 

Два вопроса:

  1. Почему мне нужно выбрать Related creditCard для отдельной переменной вместо использования точечной нотации?
  2. Я получаю ошибку invalid association [] в компании Related, и ни точечная запись, ни связанная работа. Как мне вернуть это обратно?

1 Ответ

5 голосов
/ 22 апреля 2019

В соответствии с документацией , вам нужно установить auto_preload на true для автоматической предварительной загрузки для работы. Таким образом, изменив строку, в которой вы извлекаете пользователя:

common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1)

должен дать ожидаемый результат.


В примечании стороны никогда игнорировать ошибки. Вы всегда можете добавить .Error почти к каждой операции в gorm и проверить возвращаемую ошибку. Например:

err = common.DB.AutoMigrate(...).Error
if err != nil {
    // handle err
}

err = common.DB.Create(&user).Error
// Check for err
err = common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1).Error
// Check for err
...