gpt4 book ai didi

戈尔姆 |如何使用扫描和预加载

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:48 26 4
gpt4 key购买 nike

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

我的要求:我想获得一次UserID的所有Reminder

  • 解决方案 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

请帮我解决这个问题。在我的例子中,我想自动预加载对象 Action 并在连接两个表 ReminderUser_Reminder

时选择所有列

非常感谢。

最佳答案

@Anh Vinh HuynhGorm Scan 方法不支持预加载,因此您必须改用 Find 方法。 (你的解决方案2)并从

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com