【问题标题】:Custom Gorm preloading does not fetch data自定义 Gorm 预加载不获取数据
【发布时间】:2021-03-25 01:46:43
【问题描述】:

我有一个从jobs 表及其作者(每个作业都有一个author)中获取行的查询,但我想选择特定字段。

type User struct {
    ID         uint      `gorm:"primarykey" json:"-"`
    UUID       uuid.UUID `gorm:"type:uuid not null" json:"-"`
    Email      string    `gorm:"type:varchar(255); not null" json:"email"`
    Name       string    `gorm:"type:varchar(255); not null" json:"name"`
    AvatarURL  string    `gorm:"type:varchar(255); not null" json:"avatar_url"`
    Provider   string    `gorm:"type:varchar(255); not null" json:"provider"`
    ProviderID string    `gorm:"type:varchar(255); not null" json:"-"`
    Jobs       []Job     `json:"-"`
}

type Job struct {
    ID      uint   `gorm:"primarykey" json:"id"`
    Title   string `gorm:"type:varchar(255); not null" json:"title"`
    Content string `gorm:"not null" json:"content"`
    UserID  uint   `json:"-"`
    User    User   `json:"author"`
}

func (jobRepo repository) FindAll() ([]entity.Job, error) {
    var jobs []entity.Job

    if dbc := jobRepo.db.Preload("User", func(db *gorm.DB) *gorm.DB {
        return db.Select("Name", "Email")
    }).Find(&jobs); dbc.Error != nil {
        return nil, dbc.Error
    }

    return jobs, nil
}

自定义预加载的行为不符合预期。如果我没有指定具体字段,则查询有效并返回所有内容。 否则,如果我指定一些字段,它不会返回任何内容。

【问题讨论】:

  • 你试过全小写字母吗,比如db.Select("name", "email")
  • 是的,结果完全一样。
  • 根据提供的链接中的示例,您可能需要指定一个表,例如db.Select("users.name", "users.email")gorm.io/docs/preload.html#Custom-Preloading-SQL
  • 是的。这个我也试过了,不行。

标签: go go-gorm


【解决方案1】:

这是因为您没有选择主键。在 select 子句中添加“ID”:

func(db *gorm.DB) *gorm.DB {
    return db.Select("ID", "Name", "Email")
}

否则 GORM 不知道如何将用户加入作业。

【讨论】:

  • 似乎工作正常。我已接受您的回答,赏金将在 7 小时内收到。欣赏,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多