【问题标题】:Golang Gorm: Is it possible to delete a record via a many2many relationship?Golang Gorm:是否可以通过 many2many 关系删除记录?
【发布时间】:2016-07-08 15:16:48
【问题描述】:

我有一个类似于 GORM 示例的 many2many 结构:

// User has and belongs to many languages, use `user_languages` as join table
type User struct {
    gorm.Model
    Languages         []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name string
}

db.Model(&user).Related(&languages)

假设我创建了一个用户,它有两种关联的语言。

我从数据库中获取用户记录并从用户的 Languages 数组中删除一种语言。然后我将 gorm:save_associations 设置为 true 来保存用户。

我希望 GORM 删除将用户与该语言相关联的记录(在 GORM 管理的关联表中)。但是,它不会被删除。这是预期的吗?

是否可以通过从用户记录的语言列表中删除一种语言然后保存用户来删除 many2many 关联记录?如果没有,应该如何在 GORM 中完成?

更新

我找到了解决这个问题的方法,但不确定这是不是最好的方法。我存储当前语言,清除所有关联,然后重新添加语言,然后保存。

languages := user.Languages
DB.Model(&user).Association("Languages").Clear()
user.Languages = languages

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    我遇到了同样的问题,如果您只想删除对我有用的关联之一

        c.DB.Model(&user).Association("Roles").Delete(&role)
    

    【讨论】:

    • 谢谢亚历克斯。我在 gorm 单元测试中看到了这种方法。虽然没有满足我的要求。我需要从前端发回包含更新语言列表的修改用户。我不知道需要删除的特定语言。
    • 我使用这个 c.DB.Model(&user).Association("Roles").Delete(user.Roles) 其中 user.Roles 是一个角色数组,它删除了所有的关联角色和用户
    【解决方案2】:

    另外,您可以使用“替换”来做到这一点

    DB.Model(&user).Association("Languages").Replace(user.Languages)
    

    【讨论】:

      【解决方案3】:

      我找到了解决这个问题的方法,但不确定这是不是最好的方法。我存储当前语言,清除所有关联,然后重新添加语言,然后保存。

      languages := user.Languages 
      DB.Model(&user).Association("Languages").Clear()
      user.Languages = languages
      

      【讨论】:

      • 所以你必须与所有当前的关联进行交互?想象一下,如果你不是在做一个小项目,而是一个有 10k 条记录的项目......
      • 你需要@user3389 的回答中提到的替换方法。
      猜你喜欢
      • 2015-02-24
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多