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


我知道如果有更好的组织方式,我可能会错误地设计我的架构,我将非常感激,在此先感谢。


一只名叫tom的猫
浏览 517回答 1
1回答

萧十郎

我认为您应该将消息分隔User到SentMessages和ReceivedMessages中。然后你可以像这样指定外键User:SentMessages      []*Message `gorm:"foreignkey:SenderID" json:"sentMessages"`ReceivedMessages  []*Message `gorm:"foreignkey:RecipientID" json:"receivedMessages"`然后将其用作以下内容:var users []*models.Usererr := db.Preload("SentMessages").Preload("ReceivedMessages").Find(&users).Errorif err != nil {  return nil, err}return users, err应该可以按您的意愿工作
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go