我正面临着这个问题:
我有这样的结构:
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()
功能,它只会停止更新外地字段。
有没有办法更新或正确创建链接的每个表?
答案 0 :(得分:1)
我这样做:
要更新数据,只需传递一个只包含您要更新的字段的结构:
db.Model(&data).Updates(Data{UserID: 2, AnswerID: 2})
并添加新实体:
db.Model(&data).Association("Entities").Append([]*Entity{&Entity{Name: "mynewentity"}})
答案 1 :(得分:0)
到目前为止,我发现的唯一一个就是这个:
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)
但我在这里发现了两个问题:
1)无法进行更深入的子请求:
Select("entity_id").
Where(
"data_id = ?",
data.ID,
)...
如果不是data.ID
我想更深入地处理其他子请求,那将无效。
2)如果有多个2-many-many,我认为我需要复制查询。
答案 2 :(得分:0)
我能够使用Association.Replace根据文档进行解析。 http://gorm.io/docs/associations.html#Replace-Associations
db.Debug().First(&data)
data.Name = "New Name"
db.Save(&data).Association("Entities").Replace([]Entity{{Name: "mynewentity"}})