Как обновить отношения "многие-ко-многим"

Я столкнулся с трудностями с ходом orm gorm:

У меня есть такая структура:

type Data struct {
 gorm.Model
 UserID int 'json:"user_id,omitempty"'
 AnswerID int 'json:"answer_id,omitempty"'
 Entities []Entity 'gorm:"many2many:data_entities;"'
}

type Entity struct {
 gorm.Model
 Name string
}

И теперь, если я это сделаю:

db.Model(&data).Where(Data{AnswerID: data.AnswerID}).Assign(&data).FirstOrCreate(&data)

Или

db.Model(&data).Where(Data{AnswerID: d.AnswerID}).Update(&data)

Мои поля "многие-ко-многим" не обновляются, а создаются... Приводят к дублированиям, если они уже существуют.

Если я попытаюсь сыграть с функцией Related(), он просто перестанет обновлять внешнее поле.

Есть ли способ обновить или создать правильно все связанные таблицы?

2 ответа

Я делаю это так:

Чтобы обновить данные, просто передайте структуру только с полями, которые вы хотите обновить:

db.Model(&data).Updates(Data{UserID: 2, AnswerID: 2})

и добавить новые объекты:

db.Model(&data).Association("Entities").Append([]*Entity{&Entity{Name: "mynewentity"}})


Пока что я нашел только один:

db.Table("entities").
 Where(
 "id in (?)",
 db.Table("data_entities").
 Select("entity_id").
 Where(
 "data_id = ?",
 data.ID,
 ).
 QueryExpr(),
 ).
 Where("entity_name = ?", *entityName).
 Update(&data.Entity)

Но я нашел здесь 2 проблемы:

1) Невозможно выполнить более глубокое подзапрос:

Select("entity_id").
 Where(
 "data_id = ?",
 data.ID,
 )...

Не будет работать, если вместо data.ID я хочу углубиться в другой data.ID. 2) в случае множественного числа-2-многма я предполагаю, что мне нужно будет дублировать запрос.

licensed under cc by-sa 3.0 with attribution.