GORM ORM: Возможна предварительная загрузка в обоих направлениях? - PullRequest
0 голосов
/ 02 августа 2020

Я хотел бы знать, можно ли предварительно загрузить данные с обеих сторон отношения. Рассмотрим этот пример:

type User struct {
    gorm.Model
    Name      string
    Documents []Document // has-many
}
type Document struct {
    gorm.Model
    UserID           uint
    Name             string
    DocumentFulltext DocumentFulltext // has-one
}
type DocumentFulltext struct {
    gorm.Model
    DocumentID uint
    Name       string
}

Благодаря этому я могу легко получить DocumentFulltext для любого данного документа, подобного этому

db.Where("id = ?", ID).Preload("DocumentFulltext").Find(&document)

Работает!

Но что, если у меня есть документ и хотите предварительно загрузить (или присоединиться) к пользователю, которому он принадлежит?

db.Where("id = ?", ID).Preload("User").Find(&document)

Это дает мне пани c. (invalid memory address)

db.Where("id = ?", ID).Joins("User").Find(&document)

И это дает шаткий SQL как .... FROM "documents" User WHERE id = ...

Как это возможно? Нужно ли мне использовать «ручные» запросы?

-

Если это невозможно: что является передовой практикой / руководством по моделированию моих отношений, чтобы я мог использовать встроенный GORM ins, как .Preload () эффективно?

Например, если я установлю отношения между пользователями и документами следующим образом:

type User struct {
    gorm.Model
    Name string
}
type Document struct {
    gorm.Model
    User             User // belongs-to
    UserID           uint
    Name             string
    DocumentFulltext DocumentFulltext // has-one
}
type DocumentFulltext struct {
    gorm.Model
    DocumentID uint
    Name       string
}

, тогда я могу предварительно загрузить оба, DocumentFulltext и User, для любого данного документа . Но я теряю возможность предварительно загружать документы и полные тексты, если я хочу сделать это для данного пользователя.

-

Любые подсказки приветствуются. Спасибо!

1 Ответ

1 голос
/ 02 августа 2020

Использование отношения с обеих сторон означает User в Document struct и Documents в User struct

type User struct {
    gorm.Model
    Name      string
    Documents []Document // has-many
}

type Document struct {
    gorm.Model
    UseredID uint
    Name     string
    User   User
}

Затем вы можете предварительно загрузить обе стороны

db.Debug().Where("id = ?", ID).Preload("User").Find(&document)
db.Debug().Where("id = ?", ID).Preload("Documents").Find(&user)
...