繁体   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