我应该如何使用软删除中的关联?我有以下结构type PrivateGormModel struct { ID uint `gorm:"primaryKey" json:"id,string"` CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` DeletedAt *time.Time `gorm:"index" json:"-"`}type Relation struct { PrivateGormModel OwnerID uint `json:"ownerID"` OwnerType string `json:"ownerType"` Addresses []Address `gorm:"polymorphic:Owner;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"addresses"` Contacts []Contact `gorm:"polymorphic:Owner;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"contacts"` People []Person `gorm:"polymorphic:Owner;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"people"` BankAccounts []BankAccount `gorm:"polymorphic:Owner;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"bankAccounts"`}type Company struct { PrivateGormModel Name string `json:"name"` Relation Relation `gorm:"polymorphic:Owner;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"relation"`}我省略了地址,联系人,人员和银行帐户结构,以保持此帖子简短,但它们是带有和的简单结构。以及以下处理程序OwnerIDOwnerTypefunc DeleteCompany(db *database.Database) fiber.Handler { return func(c *fiber.Ctx) error { id, err := IDFromParams(c) if err != nil { return c.JSON(responseKit.ParameterMissing()) } toDelete := new(model.Company) result := db.Preload("Relation.Addresses"). Preload("Relation.Contacts"). Preload("Relation.People"). Preload("Relation.BankAccounts"). Preload(clause.Associations). First(toDelete, id) fmt.Printf("\n%v", toDelete) result = db.Select("Relation.Addresses"). Select("Relation.Contacts"). Select("Relation.People"). Select("Relation.BankAccounts").因此,该关系将被删除。但它并没有为hasMany关系做任何事情。我读了这个https://gorm.io/docs/associations.html#Delete-with-Select并试图这样做,因为约束似乎没有做任何事情,但似乎没有任何作用,并删除了地址,联系人,人员和银行帐户。我应该如何软删除公司的所有关系?
1 回答
月关宝盒
TA贡献1772条经验 获得超5个赞
我已经用最新版本的Gorm对此进行了测试,并且“选择和删除”仅适用于一级关联。
所以如果你做了
db.Select("Relation").Delete(toDelete)
您会看到“公司”和“关系”都将“已删除时间”设置为当前时间戳。
要实现二级关系的软删除,您需要在单独的调用中删除这些关系:
db.Select("Addresses", "Contacts", "People", "BankAccounts").Delete(toDelete.Relation)
// or more compactly
db.Select(clause.Associations).Delete(toDelete.Relation)
同样值得问问的是,对于您的用例来说,仅软删除模型树的根目录并将其他所有内容保留原样是否还不够。
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消