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())
}
- 1 回答
- 0 关注
- 232 浏览
添加回答
举报