登录
首页 >  Golang >  Go问答

在 Go Gorm 中创建具有多对多逆向引用的关联

来源:stackoverflow

时间:2024-03-08 17:09:24 223浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《在 Go Gorm 中创建具有多对多逆向引用的关联》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

go gorm 中用于编写和更新反向引用多对多结构的记录的方法是什么。

例如,我有一个带有自引用相关属性的 contact 结构:

type contact struct {
    gorm.model

    firstname  string      `json:"first_name"`
    lastname   string      `json:"last_name"`
    middlename string      `json:"middle_name,omitempty"`
    related    []contact   `json:"related,omitempty" gorm:"many2many:related_contacts"`
}

填充两个联系人,其中每个联系人都引用另一个联系人

fred := model.Contact{
    FirstName:  "Fred",
    LastName:   "Jones",
    MiddleName: "B",
}

bill := model.Contact{
    FirstName:  "Bill",
    LastName:   "Brown",
    MiddleName: "R",
}

fred.Related = []model.Contact{bill}
bill.Related = []model.Contact{fred}

执行 db.save(&fred) 会将两条记录写入数据库;一个用于 bill,一个用于 fred,但是,bill 记录没有对 fred 的反向引用(因为它尚未添加并且没有 id)。

如果我还执行 db.save(&bill),我现在得到 4 条记录,因为保存 bill 不知道 fred 已被保存。

虽然我确实意识到我可以保存一个,然后找到第二个并更新它,但我想知道是否有更好的“gorm way”来做到这一点,我不必手动保持反向引用同步添加记录时?

还有,如果要去掉fred,有什么办法呢?我需要手动处理 related_contacts 表吗?


解决方案


我认为您遇到的问题是 bill.related 中的 fred 是一个副本,因此不会通过调用 db.save(&fred) 更新其 id。

当您调用 save 时,gorm 会检查任何模型的 id 字段,以了解是否应该创建或更新该模型。

我会尝试的是:

fred := model.contact{
    firstname:  "fred",
    lastname:   "jones",
    middlename: "b",
}
db.save(&fred)

bill := model.contact{
    firstname:  "bill",
    lastname:   "brown",
    middlename: "r",
    related:    []model.contact{fred},
}
db.save(&bill)

// now both bill and fred have ids
fred.related = []model.contact{bill}
db.save(&fred)

这里需要注意的一件事是 gorm 是否尝试保存 fred.related[0] 并进入无限循环。您可以通过 skipping the upserting of associations 进行管理。这意味着您可以将最后两行更改为:

fred.Related = []model.Contact{bill}
db.Omit("Related.*").Save(&fred)


// or using association mode
db.Model(&fred).Association("Related").Append(&bill)

编辑:关于删除。由于不知道您正在使用哪个数据库,您通常必须自己管理相关实体的删除。如果您使用的数据库支持外键约束,则可以将连接表外键声明为 references contact(id) on delete cascade。这意味着如果您删除任何 contact,连接表中包含相同 id 的行也会自动删除。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Go Gorm 中创建具有多对多逆向引用的关联》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>