如何使用多对多关系进行更新

时间:2017-12-18 15:01:22

标签: go go-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()功能,它只会停止更新外地字段。

有没有办法更新或正确创建链接的每个表?

3 个答案:

答案 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"}})