这是我的原始代码,不起作用。
this.createQueryBuilder().where(
'LOWER(:column) LIKE LOWER(:name)',
{ column: 'itemName', name: `%${options.name}%` }
);
{ "total": 0, "results": [] }
上述查询没有任何结果,但是当我像这样将列名显式放置在查询中时,它会起作用:
this.createQueryBuilder().where(
'LOWER(itemName) LIKE LOWER(:name)',
{ name: `%${options.name}%` }
);
{"total":9, "results": [<RESULTS GOES HERE>] }
是否可以在列名中为typeorm使用变量?
答案 0 :(得分:1)
我正在尝试类似的东西,并在这里偶然发现了一个(写得不是特别好)的解释:https://www.tutorialspoint.com/typeorm/typeorm_query_builder.htm
基本上,参数是为了防止 SQL 注入,所以虽然很难看到幕后发生了什么,但我猜任何字符串参数都会在最终查询中自动用单引号括起来,所以它不能解释为值以外的任何内容。
我什至尝试将参数用单引号括起来,例如
this.createQueryBuilder.where(
'":columnName" = :value',
{ columnName: 'my_column': value: 'my_value' }
);
不好。这完全阻止了参数替换并给出了错误 QueryFailedError: column "$1" does not exist
并且似乎确认此功能旨在防止 SQL 注入。
如果您想动态设置列名、表名等,这确实会保留模板字符串或字符串连接。但是,出于同样的原因,首先存在此保护措施,我将避免在用户输入时这样做。< /p>
答案 1 :(得分:0)
是的,但有一些缺点。
将查询构建为字符串并在Where函数中进行解析
const query = `{ "${field}": ${value} }`
this.createQueryBuilder.where( JSON.parse(query) )
如果您想做更复杂的事情,应该照常编写,但是要使用字符串格式。