Merge 910f753910c1a1ab34d677ace9cffc13deb338a4 into e9309d361f8777f861997089ce142744109e1aa2
This commit is contained in:
		
						commit
						6e4330c80f
					
				
							
								
								
									
										6
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project version="4">
 | 
			
		||||
  <component name="VcsDirectoryMappings">
 | 
			
		||||
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
 | 
			
		||||
  </component>
 | 
			
		||||
</project>
 | 
			
		||||
@ -3,6 +3,7 @@ package gorm
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Define callbacks for creating
 | 
			
		||||
@ -35,13 +36,33 @@ func updateTimeStampForCreateCallback(scope *Scope) {
 | 
			
		||||
 | 
			
		||||
		if createdAtField, ok := scope.FieldByName("CreatedAt"); ok {
 | 
			
		||||
			if createdAtField.IsBlank {
 | 
			
		||||
				createdAtField.Set(now)
 | 
			
		||||
				switch createdAtField.Field.Type().Kind() {
 | 
			
		||||
				case reflect.Int64:
 | 
			
		||||
					createdAtField.Set(now.Unix())
 | 
			
		||||
					break
 | 
			
		||||
				case reflect.String:
 | 
			
		||||
					createdAtField.Set(now.String())
 | 
			
		||||
					break
 | 
			
		||||
				default:
 | 
			
		||||
					createdAtField.Set(now)
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if updatedAtField, ok := scope.FieldByName("UpdatedAt"); ok {
 | 
			
		||||
			if updatedAtField.IsBlank {
 | 
			
		||||
				updatedAtField.Set(now)
 | 
			
		||||
				switch updatedAtField.Field.Type().Kind() {
 | 
			
		||||
				case reflect.Int64:
 | 
			
		||||
					updatedAtField.Set(now.Unix())
 | 
			
		||||
					break
 | 
			
		||||
				case reflect.String:
 | 
			
		||||
					updatedAtField.Set(now.String())
 | 
			
		||||
					break
 | 
			
		||||
				default:
 | 
			
		||||
					updatedAtField.Set(now)
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,7 @@ package gorm
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Define callbacks for deleting
 | 
			
		||||
@ -36,11 +37,23 @@ func deleteCallback(scope *Scope) {
 | 
			
		||||
		deletedAtField, hasDeletedAtField := scope.FieldByName("DeletedAt")
 | 
			
		||||
 | 
			
		||||
		if !scope.Search.Unscoped && hasDeletedAtField {
 | 
			
		||||
			var time interface{}
 | 
			
		||||
			switch deletedAtField.Field.Type().Kind() {
 | 
			
		||||
			case reflect.Int64:
 | 
			
		||||
				time = NowFunc().Unix()
 | 
			
		||||
				break
 | 
			
		||||
			case reflect.String:
 | 
			
		||||
				time = NowFunc().String()
 | 
			
		||||
				break
 | 
			
		||||
			default:
 | 
			
		||||
				time = NowFunc()
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			scope.Raw(fmt.Sprintf(
 | 
			
		||||
				"UPDATE %v SET %v=%v%v%v",
 | 
			
		||||
				scope.QuotedTableName(),
 | 
			
		||||
				scope.Quote(deletedAtField.DBName),
 | 
			
		||||
				scope.AddToVars(NowFunc()),
 | 
			
		||||
				scope.AddToVars(time),
 | 
			
		||||
				addExtraSpaceIfExist(scope.CombinedConditionSql()),
 | 
			
		||||
				addExtraSpaceIfExist(extraOption),
 | 
			
		||||
			)).Exec()
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Define callbacks for updating
 | 
			
		||||
@ -48,8 +49,22 @@ func beforeUpdateCallback(scope *Scope) {
 | 
			
		||||
 | 
			
		||||
// updateTimeStampForUpdateCallback will set `UpdatedAt` when updating
 | 
			
		||||
func updateTimeStampForUpdateCallback(scope *Scope) {
 | 
			
		||||
	var time interface{}
 | 
			
		||||
	if createdAtField, ok := scope.FieldByName("UpdatedAt"); ok {
 | 
			
		||||
		switch createdAtField.Field.Type().Kind() {
 | 
			
		||||
		case reflect.Int64:
 | 
			
		||||
			time = NowFunc().Unix()
 | 
			
		||||
			break
 | 
			
		||||
		case reflect.String:
 | 
			
		||||
			time = NowFunc().String()
 | 
			
		||||
			break
 | 
			
		||||
		default:
 | 
			
		||||
			time = NowFunc()
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := scope.Get("gorm:update_column"); !ok {
 | 
			
		||||
		scope.SetColumn("UpdatedAt", NowFunc())
 | 
			
		||||
		scope.SetColumn("UpdatedAt", time)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								model.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								model.go
									
									
									
									
									
								
							@ -12,3 +12,17 @@ type Model struct {
 | 
			
		||||
	UpdatedAt time.Time
 | 
			
		||||
	DeletedAt *time.Time `sql:"index"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ModelInt64 struct {
 | 
			
		||||
	ID        uint `gorm:"primary_key"`
 | 
			
		||||
	UpdatedAt int64
 | 
			
		||||
	CreatedAt int64
 | 
			
		||||
	DeletedAt int64 `sql:"index"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ModelString struct {
 | 
			
		||||
	ID        uint `gorm:"primary_key"`
 | 
			
		||||
	UpdatedAt string
 | 
			
		||||
	CreatedAt string
 | 
			
		||||
	DeletedAt string `sql:"index"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								scope.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								scope.go
									
									
									
									
									
								
							@ -687,8 +687,19 @@ func (scope *Scope) whereSQL() (sql string) {
 | 
			
		||||
		primaryConditions, andConditions, orConditions []string
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	switch deletedAtField.Field.Type().Kind() {
 | 
			
		||||
	case reflect.Int64:
 | 
			
		||||
		sql = fmt.Sprintf("%v.%v = 0", quotedTableName, scope.Quote(deletedAtField.DBName))
 | 
			
		||||
		break
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		sql = fmt.Sprintf("%v.%v = ''", quotedTableName, scope.Quote(deletedAtField.DBName))
 | 
			
		||||
		break
 | 
			
		||||
	default:
 | 
			
		||||
		sql = fmt.Sprintf("%v.%v IS NULL", quotedTableName, scope.Quote(deletedAtField.DBName))
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !scope.Search.Unscoped && hasDeletedAtField {
 | 
			
		||||
		sql := fmt.Sprintf("%v.%v IS NULL", quotedTableName, scope.Quote(deletedAtField.DBName))
 | 
			
		||||
		primaryConditions = append(primaryConditions, sql)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user