Как заполнить и внедрить массив с помощью gorm?

У меня есть 2 структуры с такими данными:

type User struct {
  Pics Pic[]
}

type Pic struct {
  Id int   
  UserId int64
}

Хотя каждый раз, когда я вставляю пользователя, каждое изображение вставляется в свою таблицу каждый раз, когда я нахожу пользователей, изображения не заполняются:

var users []User
db.Limit(pagesize).Where("updated_at > ?", date).Find(&users)

Я делаю что-то неправильно?


person Javier Manzano    schedule 11.03.2015    source источник
comment
У меня нет опыта работы с gorm, но возвращает ли ваш запрос данные изображения?   -  person Justin Wood    schedule 11.03.2015
comment
нет, это проблема, он ничего не возвращает в массиве   -  person Javier Manzano    schedule 12.03.2015


Ответы (4)


Ваши модели (структуры) на самом деле не имеют смысла, потому что User имеет массив Pic, который указывает на отношение пользователя к фотографиям "один ко многим", однако ваш пользователь не имеет самого свойства id и не может быть связан с элементами в таблице Pic.

У пользователя должно быть свойство Id, которое будет его первичным ключом, а UserId — это внешний ключ на Pic, который относится к нему. Без «отношения» между этими двумя таблицами/сущностями вы не сможете вернуть фотографии, запрашивая пользователей.

Я не уверен, что все, что вам нужно сделать, чтобы заставить ваш код работать, поскольку пример неполный, но первое, что вам нужно, это свойство Id, которое вы должны обозначить как Primarykey с аннотациями gorm. У вас также должны быть аннотации к структуре Pic, говорящие, что UserId — это внешний ключ, а Id — его первичный ключ.

Кроме того, к вашему сведению, ваш массив не встроен. Внедрение — это языковая функция, которую вы не используете, если вы внедряете свойство, у него нет имени, и к его свойствам можно получить доступ непосредственно из экземпляра типа внедрения.

person evanmcdonnal    schedule 16.04.2015

У меня были эти проблемы один раз. Затем я использовал функцию Join. Смотрите мой пример, который отлично работает:

type FileType struct {
     Id         int
}
type File struct {
     Id           int  
     FileType     `xorm:"extends"`
}

file := File{Id: id}


has, err := eng.
    Join("INNER", "FileType", "FileType.IdFileType = File.IdFileType").
    Get(&file)
person Felix Ribeiro    schedule 16.04.2015

Вы, наверное, уже знаете. Вы должны думать, что создаете таблицу SQL с отношением 1 ко многим. Вот пример:

type Entry struct {
  ID int
  Name string
  ...
  ContainerID int
}

type Container struct {
  ID int
  Tag int
  Name string
  ...
  Entries []Entry `gorm:"foreignkey:ContainerID"`
}

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

c := getContainerFromDB(...)
if err := getROConn().Model(c).Related(&c.Entries, "Entries").Error; err != nil {
    return errors.Wrap(err, "error getting container field")
}
person Schultz9999    schedule 27.07.2018

Попробуйте предварительно загрузить

db.Limit(pagesize).Where("updated_at > ?", date).Preload("Pics").Find(&users)
person msmaromi    schedule 19.08.2020