feat: add before find hook
This commit is contained in:
parent
9f273777f5
commit
9cdaf44650
@ -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)
|
||||||
|
@ -34,6 +34,10 @@ type AfterDeleteInterface interface {
|
|||||||
AfterDelete(*gorm.DB) error
|
AfterDelete(*gorm.DB) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BeforeFindInterface interface {
|
||||||
|
BeforeFind(*gorm.DB) error
|
||||||
|
}
|
||||||
|
|
||||||
type AfterFindInterface interface {
|
type AfterFindInterface interface {
|
||||||
AfterFind(*gorm.DB) error
|
AfterFind(*gorm.DB) error
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,18 @@ import (
|
|||||||
"gorm.io/gorm/utils"
|
"gorm.io/gorm/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func BeforeQuery(db *gorm.DB) {
|
||||||
|
if db.Error == nil && db.Statement.Schema != nil && !db.Statement.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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Query(db *gorm.DB) {
|
func Query(db *gorm.DB) {
|
||||||
if db.Error == nil {
|
if db.Error == nil {
|
||||||
BuildQuerySQL(db)
|
BuildQuerySQL(db)
|
||||||
|
@ -24,6 +24,7 @@ const (
|
|||||||
callbackTypeAfterSave callbackType = "AfterSave"
|
callbackTypeAfterSave callbackType = "AfterSave"
|
||||||
callbackTypeBeforeDelete callbackType = "BeforeDelete"
|
callbackTypeBeforeDelete callbackType = "BeforeDelete"
|
||||||
callbackTypeAfterDelete callbackType = "AfterDelete"
|
callbackTypeAfterDelete callbackType = "AfterDelete"
|
||||||
|
callbackTypeBeforeFind callbackType = "BeforeFind"
|
||||||
callbackTypeAfterFind callbackType = "AfterFind"
|
callbackTypeAfterFind callbackType = "AfterFind"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -52,7 +53,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
|
||||||
@ -308,7 +309,7 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
callbackTypeBeforeUpdate, callbackTypeAfterUpdate,
|
callbackTypeBeforeUpdate, callbackTypeAfterUpdate,
|
||||||
callbackTypeBeforeSave, callbackTypeAfterSave,
|
callbackTypeBeforeSave, callbackTypeAfterSave,
|
||||||
callbackTypeBeforeDelete, callbackTypeAfterDelete,
|
callbackTypeBeforeDelete, callbackTypeAfterDelete,
|
||||||
callbackTypeAfterFind,
|
callbackTypeBeforeFind, callbackTypeAfterFind,
|
||||||
}
|
}
|
||||||
for _, cbName := range callbackTypes {
|
for _, cbName := range callbackTypes {
|
||||||
if methodValue := callBackToMethodValue(modelValue, cbName); methodValue.IsValid() {
|
if methodValue := callBackToMethodValue(modelValue, cbName); methodValue.IsValid() {
|
||||||
@ -396,6 +397,8 @@ func callBackToMethodValue(modelType reflect.Value, cbType callbackType) reflect
|
|||||||
return modelType.MethodByName(string(callbackTypeBeforeDelete))
|
return modelType.MethodByName(string(callbackTypeBeforeDelete))
|
||||||
case callbackTypeAfterDelete:
|
case callbackTypeAfterDelete:
|
||||||
return modelType.MethodByName(string(callbackTypeAfterDelete))
|
return modelType.MethodByName(string(callbackTypeAfterDelete))
|
||||||
|
case callbackTypeBeforeFind:
|
||||||
|
return modelType.MethodByName(string(callbackTypeBeforeFind))
|
||||||
case callbackTypeAfterFind:
|
case callbackTypeAfterFind:
|
||||||
return modelType.MethodByName(string(callbackTypeAfterFind))
|
return modelType.MethodByName(string(callbackTypeAfterFind))
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user