gorm 如何在 gin controller 中构建复杂的查询条件?

我的的查询为:

controller

// 接收query 的参数
func Index(c *gin.Context){
 name:=c.DefaultQuery(xxxx,"") // 这里的query 会有不同的参数
 age:=c.DefaultQuery(xxxx,"") // 这里的query 会有不同的参数
 time:=c.DefaultQuery(xxxx,"") // 这里的query 会有不同的参数
 whereStr:="name and ? age >? time < ?" //构建sql 语句
 UserServie.Find(whereStr,name,age,time) // 执行查询
}

service

func Find(where interface{},parm ...interface{})(list []model.UserModel){
 db.where(where,parm).Find(&list)
 return list
}

我的问题出现在了controller 中

我不知道如何构建灵活的查询条件

比如前端会get 很多的参数过来,比如姓名年龄时间 或者他只get姓名时间

这样我这里的构建就很麻烦了,也不优雅

请问各位遇到这种情况是如果构建的? map?

阅读 2.1k
2 个回答

1、接收所有参数 并返回为map

query := c.Request.URL.Query()
    var queryMap = make(map[string]any, len(query))
    for k := range query {
        if c.Query(k) != "" {
            queryMap[k] = c.Query(k)
        }
    }
    return queryMap

2、gorm 构建复杂where

func (a *accountService) BuildSql(fields any, where map[string]any) *gorm.DB {
    var db = Db
    if fields != nil {
        db = db.Select(fields)
    }
    if where != nil {
        if _, ok := where["id"]; ok {
            db = db.Where("id = ?", where["id"])
        }
        if _, ok := where["types"]; ok {
            db = db.Where("types = ?", where["types"])
        }
    }
    return db
}

如果想要自动生成查询条件,你的需要定义一个规范,否则没法解析。比如这样接口:?query=name=xx,age=12,time<2023-12-13
然后你就可以解析为key-value的模式,自动生成查询条件,但是要主要安全,内部系统可以这样使用。
或者直接通过请求体定义更加复杂的格式

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题