我正在尝试使用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
- 1 回答
- 0 关注
- 297 浏览
添加回答
举报
0/150
提交
取消