【问题标题】:Go-Gorm | How to use Scan and PreloadingGo-Gorm |如何使用扫描和预加载
【发布时间】:2019-04-26 19:27:45
【问题描述】:

我是 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 中的所有列。但是错过了表User_Reminder中的两列Start_AtEnd_At

请帮我解决这个问题。就我而言,我想在连接两个表ReminderUser_Reminder 时自动预加载对象操作并选择所有列

非常感谢。

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    @Anh Vinh Huynh Gorm Scan 方法不支持 Preloading,因此您必须使用 Find 方法代替。 (您的解决方案2) 并从

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

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多