Горм Голанг получает коллекцию и ее взаимосвязи

Недавно я начал использовать Golang и решил попробовать GORM в качестве ORM. Он работает довольно хорошо с большинством вещей, но, поскольку большинство ORM иногда ограничены. К счастью, он очень хорошо связан с базой данных / sql, поэтому я могу легко выполнять пользовательские запросы.

Мне интересно, есть ли какой-либо другой способ сделать это в gorm: у меня есть структура компаний, у компаний есть отношения от одного до многих с помощью электронной почты, адресов и телефонов. Я использую следующий код в gorm, чтобы получить список компаний и соответствующую информацию. Я использую функцию предварительной загрузки gorm.

db.DBAccess.
    Model(&companies).
    Count(&dbInfo.Count).
    Order("companies.id asc").
    Offset(offset).
    Limit(length).
    Preload("Addresses").
    Preload("Phones").
    Preload("Emails").
    Find(&companies)

Это прекрасно работает. Однако я чувствую, что есть другой способ добиться этого без функции предварительной загрузки. Любые идеи?


person user1943442    schedule 20.03.2015    source источник
comment
Что у тебя на уме? В общем, вы могли бы реализовать обратный вызов запроса, но я не думаю, что это того стоит. Автоматическая отложенная загрузка невозможна, поскольку в полях структуры отсутствует механизм перехвата.   -  person 0x434D53    schedule 17.05.2015
comment
Не могли бы вы привести образцы моделей? Я бы ожидал, что он загрузит их без явного вызова Preload, если отношение указано правильно. Если нет, в пакет следует добавить какой-то параметр, например CascadingRead, который вызывает рекурсивное создание экземпляра, а не возвращает мне объект с пустыми массивами, который должен содержать многие элементы, с которыми мой текущий объект имеет отношения внешнего ключа.   -  person evanmcdonnal    schedule 09.06.2015


Ответы (1)


Вы можете загрузить связанные объекты позже (только когда / при необходимости) с помощью DB.Related, как показано в документации:

// User has many emails
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111;
// user_id is the foreign key, 111 is user's primary key's value

// Specify the foreign key
db.Model(&user).Related(&emails, "ProfileId")
//// SELECT * FROM emails WHERE profile_id = 111;
// profile_id is the foreign key, 111 is user's primary key's value

Другого пути в документации не вижу.

person HectorJ    schedule 04.09.2015