猿问

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

我正在尝试使用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可以做到这一点吗?

如何创建和保存此关系以及其他信息?


慕斯709654
浏览 298回答 1
1回答

慕的地8271018

这实际上非常简单,这是一个功能齐全的模型,这意味着您可以使用它直接与连接表进行交互,就像任何其他模型一样:FooBar// assuming we have a Foo foo and Bar bar// readlinks := []FooBar{}db.Where(FooBar{FooUUID: foo.UUID, BarUUID: bar.UUID}).Find(&links)// createlink := FooBar{FooUUID: foo.UUID, BarUUID: bar.UUID, ExtraValue: "foobar"}db.Create(&link)// updatelink.ExtraValue = "foobarbaz"db.Save(&link)// deletedb.Delete(&link)但是,要完成所有这些操作,您需要将联接表视为单独的模型。例如,您不应该期望能够在Foo上执行常规关联操作时提取,因为字段上实际上没有空间来放置值。保存 也是如此,除非你用 Hooks 做一些特殊的伎俩(有关此内容的更多信息,请参阅此答案)。ExtraValue[]BarExtraValue
随时随地看视频慕课网APP

相关分类

Go
我要回答