go - golang,在 2 个模型之间创建关系并使用 gorm 通过 Preload 检索它们
问题描述
我正在使用 gqlgen 和 gorm 作为 orm 学习 golang,我正在创建一个使用 2 个模型用户和消息的应用程序,其中用户有一个消息列表,并且消息有发送者和接收者。我使它们如下所示
type User struct {
ID string `json:"id" gorm:"primary_key;type:uuid;default:uuid_generate_v4()"`
Username string `json:"username"`
Email string `json:"email"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Messages []*Message `json:"messages"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `json:"deleted_at" sql:"index"`
}
type Message struct {
ID string `json:"id" gorm:"primary_key;type:serial"`
Title string `json:"title"`
Body string `json:"body"`
DueDate time.Time `json:"dueDate"`
IsViewed bool `json:"isViewed" gorm:"default:false"`
SenderID string `json:"senderId" gorm:"type:uuid"`
Sender *User `json:"sender" gorm:"foreignkey:SenderID"`
RecipientID string `json:"recipientId" gorm:"type:uuid"`
Recipient *User `json:"recipient" gorm:"foreignkey:RecipientID"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt *time.Time `json:"deleted_at" sql:"index"`
}
当我使用 Preload 检索消息数据时
var messages []*models.Message
err := db.
Preload("Sender").
Preload("Recipient").
Find(&messages).Error
if err != nil {
return nil, err
}
return messages, err
它工作得很好,但我的问题是在尝试检索预加载消息的用户时。
var users []*models.User
err := db.
Preload("Messages").
Find(&users).Error
if err != nil {
return nil, err
}
return users, err
这给了我以下错误can't preload field Messages for models.User
我知道如果有更好的组织方式,我可能会错误地设计我的架构,我将非常感激,在此先感谢。
解决方案
我认为您应该将消息分隔User
到SentMessages
和ReceivedMessages
中。然后你可以像这样指定外键User
:
SentMessages []*Message `gorm:"foreignkey:SenderID" json:"sentMessages"`
ReceivedMessages []*Message `gorm:"foreignkey:RecipientID" json:"receivedMessages"`
然后将其用作以下内容:
var users []*models.User
err := db.
Preload("SentMessages").
Preload("ReceivedMessages").
Find(&users).Error
if err != nil {
return nil, err
}
return users, err
应该可以按您的意愿工作
推荐阅读
- c - . C 编程 - 通过套接字发送信号?
- php - 如何获得数量的总和并发送到另一个表(Laravel)
- sql - [SQL Server]关键字“as”附近的语法不正确
- asp.net - HttpUtility.HtmlDecode() exept vb.net 中的一些特定字符串
- python - Flask restful:带有 POST 的动态参数
- python - 使用 Selenium Python ChromeDriver 从弹出窗口/表单下载 PDF
- go - 将 interface{} 转换为类型
- reporting-services - SSRS 报告本地机器执行错误
- bash - How to write one line bash if with background executing command
- python - 在同一页烧瓶上显示结果