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

Но загвоздка с этим кодом в том, что я выберу все столбцы на основе свойства моей модели.

Что делать, если я хочу выбрать только определенный столбец с предварительной загрузкой? Например, я хочу выбрать только type для QuestionBody

Я знаю, что вы можете создать другую структуру для оператора select, как описано в документы, но есть ли другие способы? Я не хочу создавать структуру для каждого оператора select.

В Laravel Eloquent вы можете сделать что-то вроде это

пожалуйста, проверьте ответ и дайте мне знать любой вопрос в ответ.

Chandan 09.05.2022 10:20
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько проблем, на которые я хотел бы обратить внимание

  • У вас нет ассоциации many2many, определенной в QuestionHeader для QuestionBody или QuestionSolution
  • В запросе вы используете столбец status, но мне кажется, что они не определены в QuestionBody или QuestionSolution
  • Переименуйте столбец QuestionBody id в QuestionBodyId в QuestionBody

В соответствии с пунктами изменения будут такими, как показано ниже:

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)
}

В Preload Select нам нужно было бы включить уникальный первичный ключ для gorm, чтобы однозначно идентифицировать связанный срез структур.

да, извините за путаницу, пример кода - это модифицированная версия моего реального кода, и я кое-что упустил

Wibisono Indrawan 10.05.2022 11:18

Другие вопросы по теме