钩子Hook
Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。
示例
//定义的model
type User struct {
gorm.Model
Username string
Password string
Role_name string
Mobilephone string
State bool
}
//定义的BeforeDelete钩子
func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
if u.ID == 1 {
return errors.New("无法删除管理员")
}
return nil
}
查看官方文档
对BeforeDelete的描述
// 开始事务
BeforeDelete
// 删除 db 中的数据
AfterDelete
// 提交或回滚事务
具体使用
db.Transaction(func(tx *gorm.DB) error {
//会自动调用前面定义的钩子
if err := tx.Delete(&model.User{
Model: gorm.Model{
ID: Id, //必须在这里传入id,否则钩子不起作用
},
}, id).Error; err != nil {
fmt.Println(err)
return err
}
return nil
})
如果传入id=1,自动调用钩子会返回一个错误信息:无法删除管理员,然后会自动回滚。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
注意:
1.如果上面是这样调用的:
tx.Delete(&model.User{},1)
其他的不变,那么钩子将不起作用,因为id=1没有传入结构体
(大概)
2.钩子只能在事务中生效
3.本文只用了一种钩子,其他的钩子依葫芦画瓢就行 ^ _ ^