feat:add before find hook

This commit is contained in:
EpicMo 2023-07-31 10:06:15 +08:00
parent a7f01bd1b2
commit dded604878
4 changed files with 19 additions and 2 deletions

View File

@ -48,6 +48,7 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) {
createCallback.Clauses = config.CreateClauses createCallback.Clauses = config.CreateClauses
queryCallback := db.Callback().Query() queryCallback := db.Callback().Query()
queryCallback.Register("gorm:before_query", BeforeQuery)
queryCallback.Register("gorm:query", Query) queryCallback.Register("gorm:query", Query)
queryCallback.Register("gorm:preload", Preload) queryCallback.Register("gorm:preload", Preload)
queryCallback.Register("gorm:after_query", AfterQuery) queryCallback.Register("gorm:after_query", AfterQuery)

View File

@ -37,3 +37,7 @@ type AfterDeleteInterface interface {
type AfterFindInterface interface { type AfterFindInterface interface {
AfterFind(*gorm.DB) error AfterFind(*gorm.DB) error
} }
type BeforeFindInterface interface {
BeforeFind(*gorm.DB) error
}

View File

@ -314,3 +314,15 @@ func AfterQuery(db *gorm.DB) {
}) })
} }
} }
func BeforeQuery(db *gorm.DB) {
if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && db.Statement.Schema.BeforeFind {
callMethod(db, func(value interface{}, tx *gorm.DB) bool {
if i, ok := value.(BeforeFindInterface); ok {
db.AddError(i.BeforeFind(tx))
return true
}
return false
})
}
}

View File

@ -38,7 +38,7 @@ type Schema struct {
BeforeUpdate, AfterUpdate bool BeforeUpdate, AfterUpdate bool
BeforeDelete, AfterDelete bool BeforeDelete, AfterDelete bool
BeforeSave, AfterSave bool BeforeSave, AfterSave bool
AfterFind bool BeforeFind, AfterFind bool
err error err error
initialized chan struct{} initialized chan struct{}
namer Namer namer Namer
@ -288,7 +288,7 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
} }
} }
callbacks := []string{"BeforeCreate", "AfterCreate", "BeforeUpdate", "AfterUpdate", "BeforeSave", "AfterSave", "BeforeDelete", "AfterDelete", "AfterFind"} callbacks := []string{"BeforeCreate", "AfterCreate", "BeforeUpdate", "AfterUpdate", "BeforeSave", "AfterSave", "BeforeDelete", "AfterDelete", "AfterFind", "BeforeFind"}
for _, name := range callbacks { for _, name := range callbacks {
if methodValue := modelValue.MethodByName(name); methodValue.IsValid() { if methodValue := modelValue.MethodByName(name); methodValue.IsValid() {
switch methodValue.Type().String() { switch methodValue.Type().String() {