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

软删除级联不起作用

软删除级联不起作用

Go
心有法竹 2023-03-29 15:10:46
目标:如果用户在软删除中被标记为已删除,则他的日历也应被标记为已删除。结构:type User struct {    gorm.Model    Username  string    FirstName string    LastName  string    Calendar  Calendar}type Calendar struct {    gorm.Model    Name   string    UserID uint}约束:db.Model(&Calendar{}).AddForeignKey("user_id", "users(id)", "CASCADE","CASCADE")问题:硬删除有效:用户和他的日历都被删除(记录消失了)db.Exec("Delete from users where id=3")软删除无法按预期工作:db.Where("id = ?", 3).Delete(&User{})通过软删除,用户表字段 => deleted_at 已过时。日历表=?deleted_at 为空有任何想法吗?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

软删除意味着 gorm 不会删除您的数据。它只标记一个非零DeleteAt时间戳。数据库不直接支持。所以外键在这里没有作用。


这意味着您需要自己手动实现级联删除,如下所示:


func DeleteUser(db *gorm.DB, id int) error {

  tx := db.Begin()

  if tx.Where("id = ?", id).Delete(&User{}); tx.Error != nil {

    tx.Rollback()

    return tx.Error

  }

  // Changed this line

  // if tx.Where("user_id = id", 3).Delete(&Calendar{}); tx.Error != nil {

     if tx.Where("user_id = ?", id).Delete(&Calendar{}); tx.Error != nil {

    tx.Rollback()

    return tx.Error

  }

  return tx.Commit().Error

}


查看完整回答
反对 回复 2023-03-29
?
catspeake

TA贡献1111条经验 获得超0个赞

Gorm 现在有一个Delete with Select功能。

db.Select("Calender").Delete(&user)


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

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