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

所以基本上我有 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())

}

...

我已经看过这个但它不是很有帮助。我怎么能做到这一点?


谢谢你!


月关宝盒
浏览 239回答 1
1回答

尚方宝剑之说

根据您发布的问题链接和其他相关问题,可能无法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())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go