You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:33:23