I'm facing a difficulty with the go orm gorm:
I have a structure like this:
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
}
And now, either if I do:
db.Model(&data).Where(Data{AnswerID: data.AnswerID}).Assign(&data).FirstOrCreate(&data)
Or
db.Model(&data).Where(Data{AnswerID: d.AnswerID}).Update(&data)
My many-to-many fields aren't updated but created... Leading to duplications if already exists.
If I try to play with the Related()
function, it simply stop updating the foreign field.
Is there a way to update or create properly every tables linked?
So far the only I found is this one:
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)
But I found 2 problems here:
1) Impossible to do a deeper subrequest:
Select("entity_id").
Where(
"data_id = ?",
data.ID,
)...
Won't work if instead of data.ID
I want to go deeper with an other sub-request. 2) in case of multiple many-2-many I assume I would need to duplicate the query.
I do it like this:
To update your data just pass a struct with only the fields you wanna update:
db.Model(&data).Updates(Data{UserID: 2, AnswerID: 2})
and to add new entities:
db.Model(&data).Association("Entities").Append([]*Entity{&Entity{Name: "mynewentity"}})