Пользовательская предварительная загрузка Gorm не извлекает данные

#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-SQL

4. Да. Я тоже пробовал это, не работает.

Ответ №1:

Это происходит потому, что вы не выбрали первичный ключ. Добавьте «ИДЕНТИФИКАТОР» в предложение select:

 func(db *gorm.DB) *gorm.DB {
    return db.Select("ID", "Name", "Email")
}
 

В противном случае GORM не знает, как присоединять пользователей к заданиям.

Комментарии:

1. Кажется, работает. Я принял ваш ответ, и награда за вознаграждение будет получена в течение 7 часов. Ценю это, спасибо!