目标:如果在软删除中将用户标记为已删除,则其日历也应标记为已删除。
结构:
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{})
通过软删除,
有什么想法吗?
答案 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
}