helper.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package callbacks
  2. import (
  3. "sort"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/clause"
  6. )
  7. // ConvertMapToValuesForCreate convert map to values
  8. func ConvertMapToValuesForCreate(stmt *gorm.Statement, mapValue map[string]interface{}) (values clause.Values) {
  9. values.Columns = make([]clause.Column, 0, len(mapValue))
  10. selectColumns, restricted := stmt.SelectAndOmitColumns(true, false)
  11. var keys = make([]string, 0, len(mapValue))
  12. for k := range mapValue {
  13. keys = append(keys, k)
  14. }
  15. sort.Strings(keys)
  16. for _, k := range keys {
  17. value := mapValue[k]
  18. if stmt.Schema != nil {
  19. if field := stmt.Schema.LookUpField(k); field != nil {
  20. k = field.DBName
  21. }
  22. }
  23. if v, ok := selectColumns[k]; (ok && v) || (!ok && !restricted) {
  24. values.Columns = append(values.Columns, clause.Column{Name: k})
  25. if len(values.Values) == 0 {
  26. values.Values = [][]interface{}{{}}
  27. }
  28. values.Values[0] = append(values.Values[0], value)
  29. }
  30. }
  31. return
  32. }
  33. // ConvertSliceOfMapToValuesForCreate convert slice of map to values
  34. func ConvertSliceOfMapToValuesForCreate(stmt *gorm.Statement, mapValues []map[string]interface{}) (values clause.Values) {
  35. var (
  36. columns = make([]string, 0, len(mapValues))
  37. )
  38. // when the length of mapValues is zero,return directly here
  39. // no need to call stmt.SelectAndOmitColumns method
  40. if len(mapValues) == 0 {
  41. stmt.AddError(gorm.ErrEmptySlice)
  42. return
  43. }
  44. var (
  45. result = make(map[string][]interface{}, len(mapValues))
  46. selectColumns, restricted = stmt.SelectAndOmitColumns(true, false)
  47. )
  48. for idx, mapValue := range mapValues {
  49. for k, v := range mapValue {
  50. if stmt.Schema != nil {
  51. if field := stmt.Schema.LookUpField(k); field != nil {
  52. k = field.DBName
  53. }
  54. }
  55. if _, ok := result[k]; !ok {
  56. if v, ok := selectColumns[k]; (ok && v) || (!ok && !restricted) {
  57. result[k] = make([]interface{}, len(mapValues))
  58. columns = append(columns, k)
  59. } else {
  60. continue
  61. }
  62. }
  63. result[k][idx] = v
  64. }
  65. }
  66. sort.Strings(columns)
  67. values.Values = make([][]interface{}, len(mapValues))
  68. values.Columns = make([]clause.Column, len(columns))
  69. for idx, column := range columns {
  70. values.Columns[idx] = clause.Column{Name: column}
  71. for i, v := range result[column] {
  72. if len(values.Values[i]) == 0 {
  73. values.Values[i] = make([]interface{}, len(columns))
  74. }
  75. values.Values[i][idx] = v
  76. }
  77. }
  78. return
  79. }