Selecting related fields with GORM

廉价感情. 提交于 2019-12-19 19:43:04

问题


I'm new to Golang coming from a python background so trying to understand the new and different concepts. I'm trying to create related fields and then select them from the database.

Models:

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
}

Create tables and rows and select from 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)

This prints:

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

Two questions:

  1. Why do I need to select Related creditCard to a separate variable instead of using the dot notation?
  2. I get error invalid association [] on the Related company, and neither dot notation or Related work. How do I get this back?

回答1:


According to documentation, you need to set auto_preload to true for Auto Preloading to work. So changing the line where you retrieve the user to:

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

should give you the expected result.


On a side note, never ignore the errors. You can always append .Error to almost every operation in gorm and check the returned error. For example:

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


来源:https://stackoverflow.com/questions/55792332/selecting-related-fields-with-gorm

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!