Как запросить ассоциацию после успешного выполнения db.Save () - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю с Gorm и Graphql.У меня не было проблем с запросом данных, пока я не попытался соединить два существующих элемента, используя их отношения foreignkey.Вот мои две модели:

type Report struct {
    db.Base
    OwnerID         string
    Patient         patients.Patient `gorm:"association_name:Patient;"`
    PatientID       string
}
type Patient struct {
    db.Base
    ReportID   string
}

У меня есть функция для сохранения связи с базой данных:

func (s *Store) AddPatientToReport(ctx context.Context, id string, patient *patients.Patient) (*Report, error) {

    // check against user using context

    report, err := s.Report(ctx, id)
    if err != nil {
        log.Error("Could not find report.")
        return nil, err
    }

    report.PatientID = patient.ID

    if err := s.db.Save(&report).Association("Patient").Append(patient).Error; err != nil {
        log.WithError(err).Error("add patient failed")
        return nil, err
    }

    return report, nil
}

После указанной выше функции я могу запросить Report и посмотретьpatient_id.Я также могу запросить Patient и посмотреть report_id.Но следующий запрос для получения всего Patient из Report просто возвращает пустое значение.

query {
  report(id: "report_id") {
   id
   patientID // this will return the correct patient_id
   patient {
     id // this field always comes back as an empty string
   }
  }
}

Вот как настроена БД:

// NewConn creates a new database connection
func NewConn(cc ConnConf) (*Conn, error) {
    db, err := gorm.Open("mysql", cc.getCtxStr())
    if err != nil {
        return nil, err
    }

    // Models are loaded from each package. Patients is created before Reports.
    if err := db.AutoMigrate(Models...).Error; err != nil {
        log.Fatal(err)
    }


    db.LogMode(cc.Logger)

    return &Conn{db}, err
}

Я не могувыяснить, как вернуть весь patient.Есть предложения?

1 Ответ

0 голосов
/ 27 сентября 2019

Хорошо, так что, как выяснилось, мне просто нужно было спросить, а потом я сам выяснил бы это несколько минут спустя.

Я бы прочитал о Preload() в документации Горм,но не знал, где это реализовать.Я сначала попытался, когда БД загорелась, думая, что она загрузит ассоциации.Но мне действительно нужно было использовать Preload() при запуске запроса.

result := &Report{}
if err = s.db.Preload("Patient").Where(&query).First(&result).Error; err != nil {
  log.WithField("id", id).WithError(err).
    Error("could not find report")
    return nil, err
}

Теперь запрос graphql:

query {
  report(id: "some_id") {
    id
    patient {
      id // now it returns the id
      birthyear // now it returns other fields, too
      ...
    }
  }
}
...