如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。

钩子方法的函数签名应该是

创建时可用的 hook

  1. func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  2. u.UUID = uuid.New()
  3. if !u.IsValid() {
  4. err = errors.New("can't save invalid data")
  5. }
  6. return
  7. }
  8. func (u *User) AfterCreate(tx *gorm.DB) (err error) {
  9. if u.ID == 1 {
  10. }
  11. return
  12. }
  1. if !u.IsValid() {
  2. return errors.New("rollback invalid user")
  3. }
  4. return nil
  5. }

更新时可用的 hook

代码示例:

  1. func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
  2. if u.readonly() {
  3. err = errors.New("read only user")
  4. }
  5. return
  6. }
  7. // 在同一个事务中更新数据
  8. if u.Confirmed {
  9. }
  10. return
  11. }
  1. // 开始事务
  2. BeforeDelete
  3. // 删除 db 中的数据
  4. AfterDelete
  5. // 提交或回滚事务

代码示例:

查询时可用的 hook

  1. // 从 db 中加载数据
  2. // Preloading (eager loading)
  3. AfterFind

代码示例:

  1. func (u *User) AfterFind(tx *gorm.DB) (err error) {
  2. if u.MemberShip == "" {
  3. u.MemberShip = "user"
  4. }
  5. }