【问题标题】:Soft delete cascade not working软删除级联不起作用
【发布时间】:2018-08-29 18:45:43
【问题描述】:

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

结构:

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 为空白

有什么想法吗?

【问题讨论】:

    标签: mysql go go-gorm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 2013-03-03
      • 2010-10-05
      • 2012-11-18
      • 2011-06-11
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多