如何在Gorm中追加多对多关系,而不升级已存在的关联行?
在多对多关联中,我如何将一个模型与已有的其他模型关联起来,而不让GORM执行查询以插入已有的模型 例如: 假设我有两个GORM模型,它们之间存在多对多关联:如何在Gorm中追加多对多关系,而不升级已存在的关联行?,go,orm,go-gorm,Go,Orm,Go Gorm,在多对多关联中,我如何将一个模型与已有的其他模型关联起来,而不让GORM执行查询以插入已有的模型 例如: 假设我有两个GORM模型,它们之间存在多对多关联: type A struct { ID int `gorm:"primaryKey"` Bs []B `gorm:"many2many:a_bs;"` } type B struct { ID int `gorm:"primaryKey"` As [
type A struct {
ID int `gorm:"primaryKey"`
Bs []B `gorm:"many2many:a_bs;"`
}
type B struct {
ID int `gorm:"primaryKey"`
As []A `gorm:"many2many:a_bs;"`
}
假设我创建两个作为:
a1 := A{}
db.Create(&a1)
a2 := A{}
db.Create(&a2)
这将按预期产生以下查询:
INSERT INTO "as" DEFAULT VALUES RETURNING "id"
INSERT INTO "as" DEFAULT VALUES RETURNING "id"
然后假设我想创建一个B并将其与As关联:
b := B{
As: []A{a1, a2},
}
db.Create(&b)
这将导致以下查询:
INSERT INTO "as" ("id") VALUES (3),(4) ON CONFLICT DO NOTHING RETURNING "id"
INSERT INTO "a_bs" ("b_id","a_id") VALUES (3,3),(3,4) ON CONFLICT DO NOTHING
INSERT INTO "bs" DEFAULT VALUES RETURNING "id"
如何消除第一个查询,它会不必要地增加已插入的模型
使用
对于代码的第二位,则具有相同的效果。添加Omit(“As”)子句将取消整个插入。db.Omit(“As.*)。创建(&b)
gorm文件中有一条说明,详细说明了这一点。很容易错过
b := B{}
db.Create(&b)
db.Model(&b).Association("As").Append([]A{a1, a2})