Solution for using Preload and Join in gorm
is Given Below:
let’s say I have these 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"`
}
I want to select all questions and for each question i want to select the skill name for that question instead of skill id and i want to preload the TestQuestion
i tried to make this struct to store my result
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)
but i get this error “invalid field found for struct github.com…../models.QuestionResponse’s field TestQuestions: define a valid foreign key for relations or implement the Valuer/Scanner interface”
any solution ?
First i suggest you use the gorm tags in your struct, and second gorm.Model already give us some basic fields, like ID as primary key, etc (https://gorm.io/docs/models.html#gorm-Model)
But here is the struct to save some time :
// gorm.Model definition
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
I didn’t understand what you want to do with your structs, so i recommend you give a look at this: Gorm relationship error: need to define a valid foreign key for relations or it need to implement the Valuer/Scanner interface , and think more about the relations of your database.
Basic: (thanks to https://codeutlity.org/users/415628/ezequiel-muns )
- foreignKey should name the model-local key field that joins to the foreign entity.
- references should name the foreign entity’s primary or unique key.
Keep in mind that .Preload(“some stuff”), will basic do a select (*), to satisfy the Struct of your struct (eg. Orders from Users) in your database, so sometimes is just better to have the field you want in the embed and have a unique struct for that select, than a “fits all” struct.
Gorm have some funcs like Omit() to omit a field in a insert or update.