如何在GORM中动态设置where子句

iswrvxsc  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(696)

我将收到一个map[string][]string。对于Map中的每个键,我想添加如下所示的where子句。

inFilter := map[string][]string{"product_id": []string{"3", "69"}}
for key, value := range inFilter {
        filterQuerable = filterQuerable.Where("(?) IN (?)", key, value)
    }

不起作用,我试过风箱,也不起作用

filterQuerable = filterQuerable.Where("(?) IN (?)", "product_id", []string{"3", "69"})

仅以下代码有效

filterQuerable = filterQuerable.Where("product_id IN (?)",  []string{"3", "69"})
kmbjn2e3

kmbjn2e31#

我现在明白问题所在了。?是用于值的,而不是列名。如果您可以100%信任输入的来源,那么简单的字符串替换就可以了。如果您允许来自用户的数据,那么您应该 * 非常 * 小心,并验证/清理列名。
这应该可以

inFilter := map[string][]string{"product_id": []string{"3", "69"}}
for key, value := range inFilter {
   filterQuerable = filterQuerable.Where(key + " IN (?)", value)
}
blmhpbnm

blmhpbnm2#

对于这种where子句,如果已经定义了Map,甚至不需要for循环。
这应该可行:

inFilter := map[string][]string{"product_id": []string{"3", "69"}}
filterQuerable.Where(inFilter)

**文档:**https:gorm.io/docs/query.html#Struct-amp-Map-Conditions
**注意:**这有一个额外的好处,即您不能注入SQL,因为gorm会将Map解析为列/值。

相关问题