一架梯子,一头程序猿,仰望星空!
GORM面试题 > 内容正文

GORM 怎么实现软删除?


问题简答

GORM实现软删除通可以在模型中添加一个 deleted_at 字段,记录数据被删除的时间,并在模型的 BeforeDelete 钩子中自动设置该字段为当前时间,这样每次删除数据会自定维护deleted_at字段数据,然后在gorm连接配置打开SoftDelete软删除,查询数据的时候会自动过滤已经删除的数据。

问题详解:

1.定义模型

type User struct {
    gorm.Model
    Name      string
    Email     string
    // 新增deleted_at字段记录数据是否被删除
    DeletedAt gorm.DeletedAt `gorm:"index"`
}

2.通过BeforeDelete钩子,自动维护DeletedAt字段

func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
    // 每次删除数据会执行这里的代码,自动设置DeletedAt字段的值
    return tx.Model(u).Update("DeletedAt", gorm.DeletedAt{
        Time:  time.Now(),
        Valid: true,
    }).Error
}

3.开启软删除

db, err := gorm.Open(mysql.New(mysql.Config{
    DSN: "user:password@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local",
}), &gorm.Config{
    // 开启软删除
    SoftDelete: true,
})