为了账号安全,请及时绑定邮箱和手机立即绑定

如何设置关联删除在字段与软删除?

如何设置关联删除在字段与软删除?

Go
呼如林 2022-08-01 16:45:59
我应该如何使用软删除中的关联?我有以下结构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)

同样值得问问的是,对于您的用例来说,仅软删除模型树的根目录并将其他所有内容保留原样是否还不够。


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信