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  }