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

问题描述 投票:0回答:1

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

=>问题:加入两个表时选择所有列但是对象qazxsw poi无法预加载。

  • 解决方案2:
Action

=>问题:自动预加载成功对象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_AtEnd_At

请帮我解决这个问题。在我的情况下,我想自动预加载对象Action并在连接两个表User_ReminderReminder时选择所有列

非常感谢。

go go-gorm
1个回答
0
投票

@Anh Vinh Huynh Gorm扫描方法不支持预加载,因此您必须使用Find方法。 (你的Soloution2)并从StartAt和EndAt中删除User_Reminder标签

© www.soinside.com 2019 - 2024. All rights reserved.