8 // Define callbacks for deleting
10 DefaultCallback.Delete().Register("gorm:begin_transaction", beginTransactionCallback)
11 DefaultCallback.Delete().Register("gorm:before_delete", beforeDeleteCallback)
12 DefaultCallback.Delete().Register("gorm:delete", deleteCallback)
13 DefaultCallback.Delete().Register("gorm:after_delete", afterDeleteCallback)
14 DefaultCallback.Delete().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback)
17 // beforeDeleteCallback will invoke `BeforeDelete` method before deleting
18 func beforeDeleteCallback(scope *Scope) {
19 if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() {
20 scope.Err(errors.New("Missing WHERE clause while deleting"))
23 if !scope.HasError() {
24 scope.CallMethod("BeforeDelete")
28 // deleteCallback used to delete data from database or set deleted_at to current time (when using with soft delete)
29 func deleteCallback(scope *Scope) {
30 if !scope.HasError() {
31 var extraOption string
32 if str, ok := scope.Get("gorm:delete_option"); ok {
33 extraOption = fmt.Sprint(str)
36 deletedAtField, hasDeletedAtField := scope.FieldByName("DeletedAt")
38 if !scope.Search.Unscoped && hasDeletedAtField {
39 scope.Raw(fmt.Sprintf(
40 "UPDATE %v SET %v=%v%v%v",
41 scope.QuotedTableName(),
42 scope.Quote(deletedAtField.DBName),
43 scope.AddToVars(NowFunc()),
44 addExtraSpaceIfExist(scope.CombinedConditionSql()),
45 addExtraSpaceIfExist(extraOption),
48 scope.Raw(fmt.Sprintf(
50 scope.QuotedTableName(),
51 addExtraSpaceIfExist(scope.CombinedConditionSql()),
52 addExtraSpaceIfExist(extraOption),
58 // afterDeleteCallback will invoke `AfterDelete` method after deleting
59 func afterDeleteCallback(scope *Scope) {
60 if !scope.HasError() {
61 scope.CallMethod("AfterDelete")