1

我找不到我的问题的答案。我在 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. 从已选中 = 0 的目录中选择 *;

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

4

1 回答 1

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
于 2019-01-14T09:59:16.157 回答