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

时间:2015-09-03 13:00:36

标签: go go-gorm

我无法找到问题的答案。我在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
}

我收到以下错误:can't find field SubDomain in *models.Catalog

为什么会这样?

我希望会有2个查询:

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

  2. 从sub_domains中选择*,其中id =(catalog.sub_domain_id)

1 个答案:

答案 0 :(得分:0)

我对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