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

如何删除 Gorm 中关系的相关模型?

如何删除 Gorm 中关系的相关模型?

Go
月关宝盒 2023-02-06 11:21:59
所以基本上我有 3 个模型:User、Profile和Post。它们是这样相关的: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())}...我已经看过这个但它不是很有帮助。我怎么能做到这一点?谢谢你!
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

根据您发布的问题链接和其他相关问题,可能无法clause.Associations用于嵌套超过一层的关系。在你的情况下,Profile与你相关的User被删除,但Post与 相关的 s没有被删除Profile。


删除所有想要的关联的一种方法是使用删除挂钩。要么 要么BeforeDelete,AfterDelete取决于您的设置以及您的关系有多牢固。例如:


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}),它会先执行钩子,然后再执行这个查询。


另一种方法是分别执行挂钩函数中的所有查询:


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())

}


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

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