39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
package gormx
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// 根据map组装gorm的where
|
|
func BuildWhere(ctx context.Context, m *gorm.DB, where map[string]interface{}) (*gorm.DB, error) {
|
|
for key, val := range where {
|
|
switch val.(type) {
|
|
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
|
|
m = m.Where(fmt.Sprintf("%s = ?", key), val)
|
|
case string:
|
|
m = m.Where(fmt.Sprintf("%s = ?", key), val)
|
|
case float32, float64:
|
|
m = m.Where(fmt.Sprintf("%s = ?", key), val)
|
|
case bool:
|
|
m = m.Where(fmt.Sprintf("%s = ?", key), val)
|
|
case []int, []int8, []int16, []int32, []int64, []uint, []uint8, []uint16, []uint32, []uint64:
|
|
m = m.Where(fmt.Sprintf("%s in (?)", key), val)
|
|
case []string:
|
|
m = m.Where(fmt.Sprintf("%s in (?)", key), val)
|
|
case []float32, []float64:
|
|
m = m.Where(fmt.Sprintf("%s in (?)", key), val)
|
|
case []bool:
|
|
m = m.Where(fmt.Sprintf("%s in (?)", key), val)
|
|
case []interface{}:
|
|
m = m.Where(fmt.Sprintf("%s in (?)", key), val)
|
|
default:
|
|
// byte,rune,any,nil
|
|
return nil, fmt.Errorf("unknown type:%+v %T", val, val)
|
|
}
|
|
}
|
|
return m, nil
|
|
}
|