GORM中钩子的简单使用

钩子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.本文只用了一种钩子,其他的钩子依葫芦画瓢就行 ^ _ ^

你可能感兴趣的:(golang)