软删除级联不起作用

Soft delete cascade not working

Objective: 如果一个用户在软删除中被标记为已删除,他的日历也应该被标记为已删除。

结构:

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{})

通过软删除,

  1. 用户 table 字段 => deleted_at 已过时。
  2. 日历table =? deleted_at 为空白

有什么想法吗?

软删除意味着 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
}