Go-Gorm |如何使用扫描和预加载

时间:2019-04-24 03:26:39

标签: go go-gorm

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

时选择所有列

非常感谢。

1 个答案:

答案 0 :(得分:0)

@Anh Vinh Huynh Gorm Scan方法不支持预加载,因此您必须使用Find方法。 (您的Soloution2) 并从

的StartAt和EndAt删除gorm:"-"标签