我是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)
    

    =>问题:连接两个表时选择所有列,但对象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_AtUser_Reminder
    请帮我这个问题。就我而言,我想自动预加载对象Action并在连接两个表ReminderUser_Reminder时选择所有列

    非常感谢。

    最佳答案

    @安荣·休恩
    Gorm Scan方法不支持预加载,因此您必须使用Find方法。 (您的Soloution2)
    并从的StartAt和EndAt删除gorm:"-"标记

    关于go - Go-Gorm |如何使用扫描和预加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55821964/

    10-15 13:15