GORM选择带有预加载的列



假设我有这些结构体代表我的模型

type QuestionHeader struct {
QuestionHeaderId int    `gorm:"primaryKey;column:question_id" json:"question_id"`
LevelId          int    `gorm:"column:level_id" json:"level_id"`
SubjectId        int    `gorm:"column:subject_id" json:"subject_id"`
QuestionBody     []QuestionBody
QuestionSolution []QuestionSolution
OtherColumn1A    string
OtherColumn2A    string
}

type QuestionBody struct {
QuestionBody  int    `gorm:"primaryKey;column:question_id" json:"question_id"`
Value         string `gorm:"column:value" json:"value"`
Type          string `gorm:"column:type" json:"type"`
OtherColumn1B string
OtherColumn2B string
}
type QuestionSolution struct {
QuestionSolutionId int    `gorm:"primaryKey;column:question_id" json:"question_id"`
Value              string `gorm:"column:value" json:"value"`
Type               string `gorm:"column:type" json:"type"`
OtherColumn1C      string
OtherColumn2c      string
}

然后我想做一个像这样的预加载查询

qs.db().
Preload("QuestionHeader.QuestionBody", func(db *gorm.DB) *gorm.DB {
return db.Where("question_body.status = ?", 1) 
// I only want to select certain column here
}).
Preload("QuestionHeader.QuestionSolution", func(db *gorm.DB) *gorm.DB {
return db.Where("question_solution.status = ?", 1) 
// I only want to select certain column here
}).
Where("level_id = ?", 2).
Find(&questionHeaders)  // I only want to select certain column here

但这段代码的问题是,我将根据模型属性选择所有列

如果我想只选择具有预加载的特定列该怎么办?例如,我想为QuestionBody

只选择type

我知道你可以像文档中描述的那样为你的select语句创建另一个结构体,但是还有其他方法吗?我不想为每个select语句创建一个struct

在Laravel Eloquent中,你可以这样做

我想指出几个问题

  • 您没有QuestionBodyQuestionSolutionQuestionHeader中定义的many2many关联
  • 在查询中,您正在使用status列,但我似乎没有在QuestionBodyQuestionSolution中定义它们
  • QuestionBody
  • 中将QuestionBodyid列重命名为QuestionBodyId

按点变化如下:

type QuestionHeader struct {
QuestionHeaderId int                `gorm:"primaryKey;column:question_id" json:"question_id"`
LevelId          int                `gorm:"column:level_id" json:"level_id"`
SubjectId        int                `gorm:"column:subject_id" json:"subject_id"`
QuestionBody     []QuestionBody     `gorm:"many2many:question_header_question_bodies;"`
QuestionSolution []QuestionSolution `gorm:"many2many:question_header_question_solutions;"`
OtherColumn1A    string
OtherColumn2A    string
}
type QuestionBody struct {
QuestionBodyId  int   `gorm:"primaryKey;column:question_id" json:"question_id"`
Value         string  `gorm:"column:value" json:"value"`
Type          string  `gorm:"column:type" json:"type"`
Status        uint8   `gorm:"column:status;default:0" json:"status"`
OtherColumn1B string
OtherColumn2B string
}
type QuestionSolution struct {
QuestionSolutionId int    `gorm:"primaryKey;column:question_id" json:"question_id"`
Value              string `gorm:"column:value" json:"value"`
Type               string `gorm:"column:type" json:"type"`
Status             uint8  `gorm:"column:status;default:0" json:"status"`
OtherColumn1C      string
OtherColumn2c      string
}
var questionHeaders QuestionHeader
db.
Preload("QuestionBody", func(db *gorm.DB) *gorm.DB {
return db.Where("Status = ?", 1).Select("QuestionBodyId", "Value")
}).
Preload("QuestionSolution", func(db *gorm.DB) *gorm.DB {
return db.Where("Status = ?", 1).Select("QuestionSolutionId", "Value")
}).
Where("level_id = ?", 2).
Select("SubjectId").
Find(&questionHeaders)
}

在预加载Select中,我们必须为gorm包含唯一的主键,以唯一地标识结构体的相关切片

相关内容

  • 没有找到相关文章

最新更新