#go #go-gorm
# #Вперед #go-gorm
Вопрос:
У меня есть запрос, который извлекает строки из jobs
таблицы и ее автора (у каждого задания есть author
), но я хочу выбрать определенные поля.
type User struct {
ID uint `gorm:"primarykey" json:"-"`
UUID uuid.UUID `gorm:"type:uuid not null" json:"-"`
Email string `gorm:"type:varchar(255); not null" json:"email"`
Name string `gorm:"type:varchar(255); not null" json:"name"`
AvatarURL string `gorm:"type:varchar(255); not null" json:"avatar_url"`
Provider string `gorm:"type:varchar(255); not null" json:"provider"`
ProviderID string `gorm:"type:varchar(255); not null" json:"-"`
Jobs []Job `json:"-"`
}
type Job struct {
ID uint `gorm:"primarykey" json:"id"`
Title string `gorm:"type:varchar(255); not null" json:"title"`
Content string `gorm:"not null" json:"content"`
UserID uint `json:"-"`
User User `json:"author"`
}
func (jobRepo repository) FindAll() ([]entity.Job, error) {
var jobs []entity.Job
if dbc := jobRepo.db.Preload("User", func(db *gorm.DB) *gorm.DB {
return db.Select("Name", "Email")
}).Find(amp;jobs); dbc.Error != nil {
return nil, dbc.Error
}
return jobs, nil
}
Пользовательская предварительная загрузка ведет себя не так, как хотелось бы. Если я не указываю конкретные поля, запрос работает и возвращает все. В противном случае, если я укажу некоторые поля, он ничего не вернет.
Комментарии:
1. вы пробовали это со всеми строчными буквами, например
db.Select("name", "email")
?2. Да, точно такой же результат.
3. Основываясь на примере в предоставленной ссылке, возможно, вам нужно указать таблицу, например
db.Select("users.name", "users.email")
. gorm.io/docs/preload.html#Custom-Preloading-SQL4. Да. Я тоже пробовал это, не работает.
Ответ №1:
Это происходит потому, что вы не выбрали первичный ключ. Добавьте «ИДЕНТИФИКАТОР» в предложение select:
func(db *gorm.DB) *gorm.DB {
return db.Select("ID", "Name", "Email")
}
В противном случае GORM не знает, как присоединять пользователей к заданиям.
Комментарии:
1. Кажется, работает. Я принял ваш ответ, и награда за вознаграждение будет получена в течение 7 часов. Ценю это, спасибо!