1.GORM支持的钩子
钩子函数名 |
钩子作用 |
BeforeSave |
在执行数据保存前被调用,用于设置一些默认值 |
BeforeCreate |
在创建新纪录前被调用 |
AfterCreate |
在创建新纪录后被调用 |
BeforeUpdate |
在更新纪录前被调用 |
AfterUpdate |
在更新纪录后被调用 |
BeforeDelete |
在删除纪录前被调用 |
AfterDelete |
在删除纪录后被调用 |
2.hook使用例子
// 定义用户struct
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"not null"`
Email string `gorm:"unique; not null"`
Password string `gorm:"not null"`
CreatedAt time.Time
UpdatedAt time.Time
}
// 添加记录之前执行BeforeCreate
func (u *User) BeforeCreate(tx *gorm.DB) error {
// 在创建新用户之前,对密码进行加密
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
if err != nil {
return err
}
u.Password = string(hashedPassword)
return nil
}
// 添加用户之后执行
func (u *User) AfterCreate(tx *gorm.DB) error {
// 在创建新用户之后,给用户发送欢迎邮件
emailContent := fmt.Sprintf("Dear %s,\n\nThank you for signing up!", u.Name)
err := sendWelcomeEmail(u.Email, emailContent)
if err != nil {
return err
}
return nil
}
// 创建一个新用户
func CreateUser(name string, email string, password string) error {
user := &User{
Name: name,
Email: email,
Password: password,
}
result := db.Create(user)
if result.Error != nil {
return result.Error
}
return nil
}