using Preload and Join in gorm



假设我有这3个struct

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的问题,我想预加载TestQuestion我试着用这个结构体来存储我的结果

type struct QuestionResponse(
SkillName    string
Name         string    `json:"name"`
TestQuestions TestQuestion `json:"test_questions"`
}

i tried this query

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...../models.QuestionResponse的字段TestQuestions:定义一个有效的外键的关系或实现Valuer/Scanner接口"有办法吗?

首先我建议你在你的结构中使用gorm标签,然后再使用gorm。Model已经为我们提供了一些基本字段,如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接口,并更多地考虑你的数据库的关系。

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

  • foreignKey应该指定连接到外部实体的model-local key字段。
  • 引用应该指定外部实体的主键或唯一键。

请记住,. preload ("some stuff")将基本执行select(*),以满足Struct的Struct(例如;order from Users)在你的数据库中,所以有时候最好在嵌入中有你想要的字段并为那个选择有一个唯一的结构体,而不是一个"适合所有"结构体。我们有一些函数,比如省略()来省略插入或更新中的字段。

相关内容

  • 没有找到相关文章

最新更新