为了账号安全,请及时绑定邮箱和手机立即绑定

Gorm使用自定义表格和额外数据创建多对多关系

Gorm使用自定义表格和额外数据创建多对多关系

Go
慕斯709654 2022-08-09 16:57:15
我正在尝试使用gorm和自定义表实现两个模型之间的连接。在此自定义表中,我想存储有关连接模型的额外信息。根据文档,我有以下内容,func init() {    database.DB.SetupJoinTable(&Foo{}, "Bar", &FooBar{})}type Foo struct {    UUID      uuid.UUID `json:"uuid" gorm:"type:uuid;primaryKey;"`    SomeValue string    `json:"someValue"`    Bars      []Bar     `json:"bars" gorm:"many2many:foo_bars"`}type Bar struct {    UUID      uuid.UUID `json:"uuid" gorm:"type:uuid;primaryKey;"`    SomeValue string    `json:"someValue"`}type FooBar struct {    FooUUID    uuid.UUID `json:"foo" gorm:"primaryKey"`    BarUUID    uuid.UUID `json:"bar" gorm:"primaryKey"`    ExtraValue string    `json:"extraValue"`}正如我所期望的那样,上面创建了一个架构。问题是在尝试保留此关系并将所需的额外数据设置为 时。这些文档提供了有关将关系直接从 Foo 追加到 Bar 的文档,但不会将数据添加到此自定义表中。FooBar文档指出:JoinTable可以是一个功能齐全的模型所以我希望这是可能的。使用gorm可以做到这一点吗?如何创建和保存此关系以及其他信息?
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

这实际上非常简单,这是一个功能齐全的模型,这意味着您可以使用它直接与连接表进行交互,就像任何其他模型一样:FooBar


// assuming we have a Foo foo and Bar bar


// read

links := []FooBar{}

db.Where(FooBar{FooUUID: foo.UUID, BarUUID: bar.UUID}).Find(&links)


// create

link := FooBar{FooUUID: foo.UUID, BarUUID: bar.UUID, ExtraValue: "foobar"}

db.Create(&link)


// update

link.ExtraValue = "foobarbaz"

db.Save(&link)


// delete

db.Delete(&link)

但是,要完成所有这些操作,您需要将联接表视为单独的模型。例如,您不应该期望能够在Foo上执行常规关联操作时提取,因为字段上实际上没有空间来放置值。保存 也是如此,除非你用 Hooks 做一些特殊的伎俩(有关此内容的更多信息,请参阅此答案)。ExtraValue[]BarExtraValue


查看完整回答
反对 回复 2022-08-09
  • 1 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信