软删除级联不起作用

时间:2018-08-29 18:45:44

标签: mysql go go-gorm

目标:如果在软删除中将用户标记为已删除,则其日历也应标记为已删除。

结构:

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. 用户表字段=> Deleted_at已过时。
  2. 日历表=? Deleted_at为空

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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