gpt4 book ai didi

go - 预加载在 *models.Catalog 中找不到字段 fieldName

转载 作者:IT王子 更新时间:2023-10-29 02:23:47 25 4
gpt4 key购买 nike

我找不到我的问题的答案。我在 golang 项目中使用 jinzhu/gorm :)我有以下结构:

type Catalog struct {
ID int64 `gorm:"primary_key" form:"id"`
SubDomainID int64 `form:"sub_domain_id"`
ServiceTypeID int64 `form:"service_type_id"`
Checked bool `form:"checked"`
CreatedAt time.Time `form:"created_at"`
UpdatedAt time.Time `form:"updated_at"`

SubDomain SubDomain
}

type SubDomain struct {
Id int64 `gorm:"primary_key" form:"id"`
NameRu string `form:name_ru`
url string `form:url`
}

当我尝试通过预加载子域获取目录时:

var catalog Catalog
fmt.Println(catalog.SubDomain)
err := db.Preload("SubDomain").Where("checked = 0").First(&catalog).Error
if err != nil {
return &catalog, err
}

我收到以下错误:无法在 *models.Catalog 中找到字段 SubDomain

为什么会这样?

我预计会有 2 个查询:

  1. 从 checked = 0 的目录中选择 *;

  2. select * from sub_domains where id = (catalog.sub_domain_id)

最佳答案

我对 gorm 还是个新手,但我想我知道你的问题并且也有(部分)解决方案。如前所述(您自己也这么说),当应用“select * from...”时,它还会查找字段 SubDomain(因为它在您的结构中)。所以我相信这应该有效:

var catalog Catalog
fmt.Println(catalog.SubDomain)
err := db.Preload("SubDomain").Select("ID","SubDomainID", "ServiceTypeID").Where("checked = 0").First(&catalog).Error
if err != nil {
return &catalog, err
}

请注意我是如何指定确切字段的。更好的解决方案是使用反射编写一个函数来排除属于字段的成员。我自己也在使用类似的解决方案。它有点像这样:

for each member of Domain:
if member is string or boolean
fields.append(member).
return db.Select(fields) // actual gormdb's Select

关于go - 预加载在 *models.Catalog 中找不到字段 fieldName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com