软删除级联不工作

gcuhipw9  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(419)

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

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

通过软删除,
user table字段=>deleted\u at是日期。
日历表=?删除位置为空
有什么想法吗?

b4qexyjb

b4qexyjb1#

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

相关问题