簡體   English   中英

如何刪除Gorm中關系的相關模型?

[英]How to delete related models of a relation in Gorm?

所以基本上我有 3 個模型: UserProfilePost

它們是這樣相關的: User有一個Profile Profile有很多Post

它們看起來像這樣:

type User struct {
    Base             // holds this object's uuid, createdAt, updatedAt
    Role     string  `json:"role"`
    Username string  `json:"username" gorm:"unique"`
    Password string  `json:"password"`
    Profile  Profile `gorm:"constraint:OnDelete:CASCADE;"`
}

type Profile struct {
    Base          // holds this object's uuid, createdAt, updatedAt
    UserId string `json:"user_id"`
    Name   string `json:"name"`
    Bio    string `json:"bio"`
    Age    uint8  `json:"age"`
    Posts  []Post `gorm:"constraint:OnDelete:CASCADE;"`
}

type Post struct {
    Base             // holds this object's uuid, createdAt, updatedAt
    ProfileId string `json:"profile_id"`
    Caption   string `json:"caption"`
    Likes     uint32 `json:"num_likes" gorm:"default:0"`
}

我想要發生的是當我刪除用戶時,我希望刪除個人資料以及與之相關的所有帖子。 我對關系數據庫的唯一其他經驗是 Django ,這是自動的。

實際發生的情況是,當我刪除用戶時,配置文件被刪除,但帖子仍保留在數據庫中。

這就是我刪除用戶的方式:

...
base := models.Base{Id: id}
if err := configs.Database.Select(clause.Associations).Delete(&models.User{Base: base}).Error; err != nil {
    return c.Status(400).JSON(err.Error())
}
...

我已經看過這個,但它不是很有幫助。 我怎么能做到這一點?

謝謝!

根據您發布的問題鏈接和其他相關問題,可能無法對嵌套超過一層的關系使用clause.Associations 在您的情況下,與您的User相關的Profile被刪除,但與Profile相關的Post不會被刪除。

刪除所有想要的關聯的一種方法是使用刪除掛鈎。 BeforeDeleteAfterDelete ,取決於您的設置和您的關系有多牢固。 例如:

func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
  if err := tx.Joins("profiles p ON p.id = posts.profile_id").Joins("users u ON u.id = p.user_id").Where("u.id = ?", u.Base.Id).Delete(&Post{}).Error; err != nil {
    return err
  } 
  return  tx.Joins("users u ON u.id = profiles.user_id").Where("u.id = ?", u.Base.Id).Delete(&Profile{}).Error
}

這樣,當您執行configs.Database.Delete(&models.User{Base: base})時,它將先執行鈎子,然后執行此查詢。

另一種方法是分別執行來自鈎子 function 的所有查詢:

base := models.Base{Id: id}
if err := configs.Database.Joins("profiles p ON p.id = posts.profile_id").Joins("users u ON u.id = p.user_id").Where("u.id = ?", base.Id).Delete(&Post{}).Error; err != nil {
    return c.Status(400).JSON(err.Error())
}

if err := configs.Database.Joins("users u ON u.id = profiles.user_id").Where("u.id = ?", base.Id).Delete(&Profile{}).Error; err != nil {
    return c.Status(400).JSON(err.Error())
}

if err := configs.Database.Delete(&models.User{Base: base}).Error; err != nil {
    return c.Status(400).JSON(err.Error())
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM