gorm 封装map 查询条件

type NullType byte
 
const (
    _ NullType = iota
    // IsNull the same as `is null`
    IsNull
    // IsNotNull the same as `is not null`
    IsNotNull
)
 
// sql build where
func whereBuild(where map[string]interface{}) (whereSQL string, vals []interface{}, err error) {
    for k, v := range where {
        ks := strings.Split(k, " ")
        if len(ks) > 2 {
            return "", nil, fmt.Errorf("Error in query condition: %s. ", k)
        }
 
        if whereSQL != "" {
            whereSQL += " AND "
        }
        strings.Join(ks, ",")
        switch len(ks) {
        case 1:
            //fmt.Println(reflect.TypeOf(v))
            switch v := v.(type) {
            case NullType:
                if v == IsNotNull {
                    whereSQL += fmt.Sprint(k, " IS NOT NULL")
                } else {
                    whereSQL += fmt.Sprint(k, " IS NULL")
                }
            default:
                whereSQL += fmt.Sprint(k, "=?")
                vals = append(vals, v)
            }
            break
        case 2:
            k = ks[0]
            switch ks[1] {
            case "=":
                whereSQL += fmt.Sprint(k, "=?")
                vals = append(vals, v)
                break
            case ">":
                whereSQL += fmt.Sprint(k, ">?")
                vals = append(vals, v)
                break
            case ">=":
                whereSQL += fmt.Sprint(k, ">=?")
                vals = append(vals, v)
                break
            case "<":
                whereSQL += fmt.Sprint(k, "<?")
                vals = append(vals, v)
                break
            case "<=":
                whereSQL += fmt.Sprint(k, "<=?")
                vals = append(vals, v)
                break
            case "!=":
                whereSQL += fmt.Sprint(k, "!=?")
                vals = append(vals, v)
                break
            case "<>":
                whereSQL += fmt.Sprint(k, "!=?")
                vals = append(vals, v)
                break
            case "in":
                whereSQL += fmt.Sprint(k, " in (?)")
                vals = append(vals, v)
                break
            case "like":
                whereSQL += fmt.Sprint(k, " like ?")
                vals = append(vals, v)
            }
            break
        }
    }
    return
}

使用方法:

func TestWhereBuild(t *testing.T) {
    cond, vals, err := whereBuild(map[string]interface{}{
        "name": "jinzhu", 
        "age in": []int{20, 19, 18},
    })
    if err != nil {
        t.Fatal(err)
    }
    t.Log(cond)
    t.Log(vals)
 
    db.Where(cond, vals...).Find(&users)
 
}
 

原文链接:https://blog.csdn.net/qq_28053177/article/details/82187821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值