如何以多对多的方式将一个模型与已经存在的其他模型关联起来,而不让GORM对已经存在的模型执行UPSERT查询?
示例:
假设我有两个相互关联的多对多的GORM模型:
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;"`
}
假设我创建了两个As:
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"
我如何消除第一个查询,它不必要地颠倒了已经插入的A模型?
使用
b := B{}
db.Create(&b)
db.Model(&b).Association("As").Append([]A{a1, a2})
因为第二位代码具有相同的效果。添加Omit("As")子句将取消整个插入。
发布于 2020-12-16 13:34:23
db.Omit("As.*").Create(&b)
在gorm Associations : Skip Auto Create/Update文档中有一条详细说明。这很容易漏掉。
https://stackoverflow.com/questions/64253800
复制相似问题