数组未传递给knex中的查询

时间:2016-09-20 15:25:17

标签: javascript node.js knex.js

我将一个带有get查询的id数组传递给knex whereIn函数,但它们将丢失。

if(query.cols){
  var cols = query.cols.map(Number);
  console.log(cols)
  search.whereIn('collection_id', cols)
}

我将它们映射到整数以进行查询。控制台日志是......

[ 77, 66 ]

但是调试将查询显示为......

...and "collection_id" in (?, ?) 

我错过了什么?

2 个答案:

答案 0 :(得分:6)

值显示为字符串,因为knex要求数组作为包含数组内的参数传递。来自raw bindings的文档:

  

请注意,由于含糊不清,数组必须作为参数传递到包含的数组中。

knex.raw('select * from users where id in (?)', [1, 2, 3]);
// Error: Expected 3 bindings, saw 1

knex.raw('select * from users where id in (?)', [[1, 2, 3]])
Outputs:
select * from users where id in (1, 2, 3)

您可以通过将cols数组传递给数组本身来解决此问题:

if (query.cols) {
  var cols = query.cols.map(Number);
  console.log(cols)
  search.whereIn('collection_id', [cols])
}

答案 1 :(得分:0)

根据有关原始参数绑定的Knex文档,我们需要为数组中要绑定到查询的每个元素添加?

由于数组绑定没有统一的语法,因此您需要通过添加?将它们视为多个值。直接在您的查询中。 http://knexjs.org/#Raw-Bindings

const myArray = [1,2,3]
knex.raw('select * from users where id in (' + myArray.map(_ => '?').join(',') + ')', [...myArray]);
// query will become: select * from users where id in (?, ?, ?) with bindings [1,2,3]