Совместные запросы через внешний ключ

У меня есть две следующие модели: File и Session, и в одном сеансе может быть много объектов File (один ко многим).

type Session struct {
    gorm.Model
    Name            string       `json:"name,omitempty"`    
    IsCurrent       bool         `json:"is_current"`
    Files     []File `gorm:"foreignkey:SessionID" json:"files"`
}

type File struct {
    gorm.Model
    Name        string `json:"name"`
    FileType    string `json:"file_type"`
    ParentName  string `json:"parent_name"`
    SessionID   uint   `json:"session_id"`
}

Я хочу получить все файлы, связанные с сеансом, в котором IsCurrent = true

Я написал следующий необработанный SQL-запрос, который, кажется, работает нормально, но я хотел бы знать, есть ли способ выполнить аналогичный запрос int he Gorm.

err = db.Raw ("ВЫБРАТЬ * ИЗ файлов, сеансов WHERE files.session_id == sessions.id AND sessions.is_current =?", true) .Scan (& fileObjects) .Error


person TonyGW    schedule 14.04.2018    source источник


Ответы (2)


@TonyGW ключ использует комбинацию Preload и Where в вашем вызове Gorm.

currentSession := &Session{}

err := db.Model(&Session{}).Preload("Files").Where(&Session{IsCurrent: true}).Find(&currentSession).Error
if err != nil {
  fmt.Println("Error:", err)
}

fmt.Printf("%+v\n", currentSession)

К вашему сведению

Существует несколько способов структурировать Where запрос. Например,

db.Model(&Session{}).Preload("Files").Where("is_current = ?", true).Find(&currentSession)

а также использование карты для создания нескольких Where условий,

db.Model(&Session{}).Preload("Files").Where(map[string]interface{}{
  "is_current": true,
  "something_else": "value",
}).Find(&currentSession)

Надеюсь, это поможет!

person RuNpiXelruN    schedule 18.04.2018

Попробуй это

db.Where("is_current = ?", true).Model(&session).Related(&session.Files)
person Pavlo Strokov    schedule 14.04.2018