如何在Gin框架中获取多值参数cat_id的数组
问题:处理多cat_id参数及数据库查询问题
我需要在请求中接收多个cat_id值,例如请求地址为localhost:8080/products/?cat_id=1,2。当前编写的GenerateMultiParams函数无法将cat_id的多个值正确转为数组,且数据库查询语句也存在问题,相关代码如下:
现有参数处理函数
func GenerateMultiParams(c *gin.Context) models.Params { limit := 0 page := 1 cat_id := 1 query := c.Request.URL.Query() for key, value := range query { queryValue := value[len(value)-1] switch key { case "limit": limit, _ = strconv.Atoi(queryValue) case "page": page, _ = strconv.Atoi(queryValue) case "cat_id": cat_id, _ = strconv.Atoi(queryValue) } } return models.Params{ Limit: limit, Page: page, Cat_id: []cat_id, } }
Params结构体定义
type Params struct { Limit int `json:"limit"` Page int `json:"page"` Cat_id []int `json:"cat_id"` }
数据库查询语句
result := config.DB.Model(&models.Products{}).Where(q).Where("cat_id=?", pagination.Cat_id).Limit(pagination.Limit).Offset(offset).Find(&prod)
解决方案
1. 修复参数解析函数
原函数核心问题:
- 直接将带逗号的
cat_id字符串转int,必然解析失败 - 返回时
[]cat_id是语法错误,无法将单个int直接转为切片 - 未对多id进行分割处理
修改后的函数:
import "strings" import "strconv" func GenerateMultiParams(c *gin.Context) models.Params { limit := 0 page := 1 var catIDs []int query := c.Request.URL.Query() for key, values := range query { queryValue := values[0] // cat_id=1,2格式下,values切片仅含一个元素 switch key { case "limit": limit, _ = strconv.Atoi(queryValue) case "page": page, _ = strconv.Atoi(queryValue) case "cat_id": // 按逗号分割字符串,去除每个id的首尾空格 idStrs := strings.Split(queryValue, ",") for _, s := range idStrs { trimmed := strings.TrimSpace(s) id, err := strconv.Atoi(trimmed) if err == nil { catIDs = append(catIDs, id) } } } } // 若未传cat_id或解析失败,可设置默认值(根据业务需求调整) if len(catIDs) == 0 { catIDs = []int{1} } return models.Params{ Limit: limit, Page: page, Cat_id: catIDs, } }
2. 修复数据库查询语句
原查询用cat_id=?匹配数组会导致SQL语法错误,需改用IN操作符:
// 使用IN操作符匹配多个cat_id result := config.DB.Model(&models.Products{}).Where(q).Where("cat_id IN ?", pagination.Cat_id).Limit(pagination.Limit).Offset(offset).Find(&prod)
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

