我正在使用 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.Messageerr := db. Preload("Sender"). Preload("Recipient"). Find(&messages).Errorif err != nil { return nil, err}return messages, err它工作得很好,但我的問題是在嘗試檢索預加載消息的用戶時。var users []*models.Usererr := db. Preload("Messages"). Find(&users).Errorif err != nil { return nil, err}return users, err這給了我以下錯誤can't preload field Messages for models.User我知道如果有更好的組織方式,我可能會錯誤地設計我的架構,我將非常感激,在此先感謝。
1 回答

蕭十郎
TA貢獻1815條經驗 獲得超13個贊
我認為您應該將消息分隔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
應該可以按您的意愿工作
- 1 回答
- 0 關注
- 560 瀏覽
添加回答
舉報
0/150
提交
取消