github.com/goravel/framework@v1.13.9/support/database/database.go (about) 1 package database 2 3 import ( 4 "reflect" 5 "strings" 6 7 "github.com/spf13/cast" 8 ) 9 10 func GetID(dest any) any { 11 if dest == nil { 12 return nil 13 } 14 15 t := reflect.TypeOf(dest) 16 v := reflect.ValueOf(dest) 17 18 if t.Kind() == reflect.Pointer { 19 return GetIDByReflect(t.Elem(), v.Elem()) 20 } 21 22 return GetIDByReflect(t, v) 23 } 24 25 func GetIDByReflect(t reflect.Type, v reflect.Value) any { 26 for i := 0; i < t.NumField(); i++ { 27 if !t.Field(i).IsExported() { 28 continue 29 } 30 if t.Field(i).Name == "Model" && v.Field(i).Type().Kind() == reflect.Struct { 31 structField := v.Field(i).Type() 32 for j := 0; j < structField.NumField(); j++ { 33 if !structField.Field(j).IsExported() { 34 continue 35 } 36 if strings.Contains(structField.Field(j).Tag.Get("gorm"), "primaryKey") { 37 id := v.Field(i).Field(j).Interface() 38 if cast.ToString(id) == "" || cast.ToInt(id) == 0 { 39 return nil 40 } 41 42 return id 43 } 44 } 45 } 46 if strings.Contains(t.Field(i).Tag.Get("gorm"), "primaryKey") { 47 id := v.Field(i).Interface() 48 if cast.ToString(id) == "" && cast.ToInt(id) == 0 { 49 return nil 50 } 51 52 return id 53 } 54 } 55 56 return nil 57 }