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

我应该如何使用软删除中的关联?


我有以下结构


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"`

}

我省略了地址,联系人,人员和银行帐户结构,以保持此帖子简短,但它们是带有和的简单结构。以及以下处理程序OwnerIDOwnerType


func 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


并试图这样做,因为约束似乎没有做任何事情,但似乎没有任何作用,并删除了地址,联系人,人员和银行帐户。我应该如何软删除公司的所有关系?


呼如林
浏览 151回答 1
1回答

月关宝盒

我已经用最新版本的Gorm对此进行了测试,并且“选择和删除”仅适用于一级关联。所以如果你做了db.Select("Relation").Delete(toDelete)您会看到“公司”和“关系”都将“已删除时间”设置为当前时间戳。要实现二级关系的软删除,您需要在单独的调用中删除这些关系:db.Select("Addresses", "Contacts", "People", "BankAccounts").Delete(toDelete.Relation)// or more compactlydb.Select(clause.Associations).Delete(toDelete.Relation)同样值得问问的是,对于您的用例来说,仅软删除模型树的根目录并将其他所有内容保留原样是否还不够。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go