为了账号安全,请及时绑定邮箱和手机立即绑定

在 gorm 中使用预加载和加入

在 gorm 中使用预加载和加入

Go
慕码人8056858 2022-09-19 10:37:02
假设我有这3个结构type Question struct {    gorm.Model    Id            *uint64        `json:"id" gorm:"column=id;primaryKey;autoIncrement"`    Name          string         `json:"name" gorm:"unique"`    SkillId       *uint64        `json:"skill_id"`    TestQuestions []TestQuestion `json:"test_questions"`}type Skill struct {    gorm.Model    SkillName     string `json:"skill_name"`    Question []Question}type TestQuestion struct {    gorm.Model    QuestionId uint64 `json:"question_id"`    TestId     uint64 `json:"test_id"`}我想选择所有问题,对于每个问题,我想选择该问题的技能名称而不是技能ID,并且我想预加载测试问题,我试图使此结构存储我的结果type struct QuestionResponse(    SkillName    string    Name         string    `json:"name"`    TestQuestions TestQuestion `json:"test_questions"`}我试过这个查询db.Table("questions").Preload("TestQuestions").                Joins("inner join skills on questions.skill_id = skills.id").        Select("questions.name,skills.skill_name, questions.difficulty, questions.max_points, questions.type, questions.expected_time, questions.question_text,questions.file_read_me").        Find(&question)但我得到这个错误“为结构github找到无效字段.com...../模型。问题响应的字段测试问题:为关系定义一个有效的外键或实现值机/扫描仪接口“任何解决方案?
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

首先,我建议您在结构中使用 gorm 标签,然后使用第二个 gorm。模型已经给了我们一些基本的字段,比如ID作为主键等(https://gorm.io/docs/models.html#gorm-Model)但这里有一些节省时间的结构:


// gorm.Model definition

type Model struct {

  ID        uint           `gorm:"primaryKey"`

  CreatedAt time.Time

  UpdatedAt time.Time

  DeletedAt gorm.DeletedAt `gorm:"index"`

}

我不明白你想用你的结构做什么,所以我建议你看看这个: Gorm关系错误:需要为关系定义一个有效的外键,或者它需要实现Valuer / Scanner接口,并更多地考虑数据库的关系。

基本:(感谢 https://stackoverflow.com/users/415628/ezequiel-muns )

  • 外来键应命名连接到外部实体的模型本地键字段。

  • 引用应命名外部实体的主键或唯一键。

请记住.预加载(“一些东西”),基本上会做一个选择(*),以满足你的结构的结构(例如。来自用户的订单)在您的数据库中,因此有时最好在嵌入中包含所需的字段,并为该选择提供唯一的结构,而不是“适合所有”结构。Gorm有一些功能,如省略()来省略插入或更新中的字段。


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信