golang, создание отношения между двумя моделями и получение их с помощью Preload с помощью gorm - PullRequest
1 голос
/ 01 февраля 2020

Я изучаю golang, используя gqlgen и gorm в качестве orm, я создаю приложение, использующее пользователя 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"`
}

, когда я получаю данные сообщений с использованием предварительной загрузки

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

Я знаю, что могу неправильно спроектировать свою схему, если есть лучший способ ее организовать, я был бы очень признателен, спасибо заранее.

1 Ответ

1 голос
/ 01 февраля 2020

Я думаю, вы должны разделить сообщения в 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

, который должен работать так, как вы хотите

...