dqyhj2014 2019-04-22 09:39
浏览 659
已采纳

使用GORM选择相关字段

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条回答 默认 最新

  • douzhenchun6782 2019-04-22 10:34
    关注

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题