sql.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package orm
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/huandu/go-sqlbuilder"
  6. )
  7. var SqlFlavor = sqlbuilder.MySQL
  8. type SqlType uint8
  9. const (
  10. Select SqlType = iota << 1
  11. Update
  12. Insert
  13. Delete
  14. )
  15. type selectBuilder struct {
  16. *sqlbuilder.SelectBuilder
  17. }
  18. /*type selectBuilder struct {
  19. b sqlbuilder.Builder
  20. }
  21. type selectBuilder struct {
  22. b sqlbuilder.Builder
  23. }
  24. type selectBuilder struct {
  25. b sqlbuilder.Builder
  26. }*/
  27. func getSelectBuilder(tbl *table) *selectBuilder {
  28. return &selectBuilder{
  29. sqlbuilder.NewSelectBuilder().From(tbl.getNameAs(true)),
  30. }
  31. }
  32. func (sb *selectBuilder) _select(tbls ...*table) *selectBuilder {
  33. cols := []string{}
  34. for _, tbl := range tbls {
  35. for _, col := range tbl.getColumns() {
  36. cols = append(cols, col.getName(true, tbl))
  37. }
  38. }
  39. sb.Select(cols...)
  40. return sb
  41. }
  42. func (sb *selectBuilder) _where(tbl *table, i MappableInterface) *selectBuilder {
  43. tmp := tbl.Make()
  44. where := []string{}
  45. outerloop:
  46. for _, col := range tbl.getColumns() {
  47. fn := "Get" + strings.Title(col.getFieldName())
  48. val, err := tbl.CallMethod(i, fn)
  49. if err == nil {
  50. tmpv, _ := tbl.CallMethod(tmp, fn)
  51. for i, v := range val {
  52. if v == tmpv[i] {
  53. continue outerloop
  54. }
  55. }
  56. where = append(where, sb.Equal(col.getName(true, tbl), val[0]))
  57. } else {
  58. fmt.Println(err)
  59. }
  60. }
  61. sb.Where(where...)
  62. return sb
  63. }
  64. func (sb *selectBuilder) _wherePrimaryOrElse(tbl *table, i MappableInterface) *selectBuilder {
  65. if pk := tbl.getPrimaryKey(); pk != nil {
  66. val, err := tbl.CallMethod(i, "Get"+strings.Title(pk.getFieldName()))
  67. if err != nil {
  68. sb._where(tbl, i)
  69. } else {
  70. sb.Where(sb.Equal(pk.getName(true, tbl), val[0]))
  71. }
  72. } else {
  73. sb._where(tbl, i)
  74. }
  75. return sb
  76. }
  77. func (sb *selectBuilder) _join(tbl *table, rel relation, opt ...sqlbuilder.JoinOption) *selectBuilder {
  78. if len(opt) == 0 {
  79. sb.Join(rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel.table), sqlbuilder.Raw(rel.key.getName(true, tbl))))
  80. } else {
  81. sb.JoinWithOption(opt[0], rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel.table), sqlbuilder.Raw(rel.key.getName(true, tbl))))
  82. }
  83. return sb
  84. }