我應該如何使用軟刪除中的關聯?我有以下結構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 關注
- 131 瀏覽
添加回答
舉報
0/150
提交
取消