如何在不更新已经存在的关联行的情况下附加到 Gorm 中的多对多关系?
How can I append to a many-to-many relation in Gorm without upserting the already-existing associated rows?
如何在多对多关联中将一个模型与已经存在的其他模型相关联,而无需 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") 子句将取消整个插入。
db.Omit("As.*").Create(&b)
在 gorm Associations : Skip Auto Create/Update 文档中有一条注释对此进行了详细说明。很容易错过。
如何在多对多关联中将一个模型与已经存在的其他模型相关联,而无需 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") 子句将取消整个插入。
db.Omit("As.*").Create(&b)
在 gorm Associations : Skip Auto Create/Update 文档中有一条注释对此进行了详细说明。很容易错过。