Го-Горм | Как использовать сканирование и предварительную загрузку - PullRequest
0 голосов
/ 24 апреля 2019

Я новичок в Go и GORM. У меня проблема с gorm, когда я хочу объединить две таблицы и выбрать все поля в двух таблицах.

Моя модель:

Действие:

type Action struct {
    ID        uint64
    Type      int
    Url       string
}
type Reminder struct {
    ID            uint64 `gorm:"primary_key"`
    MerchantID    uint64
    MerReminderID string
    Title         string
    Description   string
    ActionID      uint64
    Action        *Action `gorm:"save_associations:false"`
    Payload       string
    StartAt       time.Time `gorm:"-"`
    EndAt         time.Time `gorm:"-"`
}
type UserReminder struct {
    UserID     uint64
    ReminderID uint64
    Reminder   Reminder
    StartAt    time.Time
    EndAt      time.Time
    Expired    bool
}

Моя просьба: я хочу получить все Reminder за один раз UserID.

  • Решение 1:
var reminders []*models.Reminder
err := db.Set("gorm:auto_preload", true).
    Raw("SELECT * FROM user_reminders AS ur, reminders AS r WHERE ur.reminder_id = r.id AND ur.user_id = ?", userID).
    Preload("Actions").
    Scan(&reminders)

=> Promblem : Выбрать все столбцы при объединении двух таблиц, но объект Action не может выполнить предварительную загрузку.

  • Решение 2:
var reminders []*models.Reminder
err := db.Set("gorm:auto_preload", true).
        Joins("JOIN user_reminders ON user_reminders.reminder_id = reminders.id").
    Where("user_reminders.user_id = ? AND user_reminders.end_at >= ? AND user_reminders.deleted_at IS NULL", userID, time.Now()).
    Find(&reminders)

=> Проблема : автоматическая предварительная загрузка объекта успеха Action и выбор всех столбцов в таблице Reminder. Но пропустить два столбца Start_At и End_At в таблице User_Reminder

Пожалуйста, помогите мне решить эту проблему. В моем случае я хочу автоматически предварительно загрузить объект Action и выбрать все столбцы при объединении двух таблиц Reminder и User_Reminder

Большое спасибо.

1 Ответ

0 голосов
/ 24 апреля 2019

@ Метод сканирования Anh Vinh Huynh Gorm не поддерживает предварительную загрузку, поэтому вместо него следует использовать метод Find.(ваш Soloution2) И удалите тег gorm:"-" из StartAt и EndAt из

...