软删除级联不起作用

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


结构:


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

有任何想法吗?


心有法竹
浏览 99回答 2
2回答

千巷猫影

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

catspeake

Gorm 现在有一个Delete with Select功能。db.Select("Calender").Delete(&user)
打开App,查看更多内容
随时随地看视频慕课网APP