📅  最后修改于: 2023-12-03 15:32:28.841000             🧑  作者: Mango
在使用Knex时,我们经常会用到Knex原始查询。在一些情况下,我们需要使用多个问号占位符来传递参数。本文将详细介绍如何使用Knex原始多个问号占位符。
Knex原始查询包含在knex.raw()
函数中。为了使用多个问号占位符,可以在查询字符串中使用多个?
,然后把需要传递的参数作为数组在knex.raw()
函数的第二个参数传递进去。例如:
const ids = [1, 2, 3];
knex.raw('SELECT * FROM users WHERE id IN (?, ?, ?)', ids)
.then(rows => console.log(rows));
在上面的例子中,我们使用?
占位符来代表要查询的id值。然后使用一个数组ids
来传递这些值。这里使用了三个问号占位符,因此ids
数组也需要包含三个元素。最终,Knex会将这些值替换到查询字符串中去,然后执行查询操作。
如果查询中包含可选参数,即某些参数可以为空或者没有传递,我们可以使用ES6的展开语法来处理它们。例如:
const name = 'John'; // 可选参数1
const age = null; // 可选参数2
const email = 'john@example.com'; // 可选参数3
const conditions = [
`name = ?`,
age === null ? null : `age = ?`,
email ? `email = ?` : null,
].filter(Boolean);
const params = [
name,
age,
email,
].filter(Boolean);
knex.raw(`SELECT * FROM users WHERE ${conditions.join(' AND ')}`, params)
.then(rows => console.log(rows));
在上面的例子中,我们使用了三个可选参数name
、age
和email
。name
和email
都是必需的参数,但age
是可选的,可能为null
,表示这个条件不需要加入查询中。我们使用一个数组conditions
来表示查询中需要加入的条件,然后使用一个数组params
来表示这些条件对应的参数。在生成查询语句时,我们使用了filter(Boolean)
函数来过滤掉null
和undefined
值。最终的查询语句和参数数组如下所示:
SELECT * FROM users WHERE name = ? AND email = ?
['John', 'john@example.com']
如果查询中有可变数量的参数,我们可以使用ES6的展开语法来处理它们。例如:
const values = [1, 2, 3, 4, 5];
const placeholders = values.map(() => '?').join(', ');
knex.raw(`SELECT * FROM foo WHERE bar IN (${placeholders})`, values)
.then(rows => console.log(rows));
在上面的例子中,我们使用了一个数组values
来表示查询中需要用到的值。然后使用map()
函数生成与数组长度相等的问号占位符,并使用join()
函数将它们拼接成一个字符串。最终的查询语句和参数数组如下所示:
SELECT * FROM foo WHERE bar IN (?, ?, ?, ?, ?)
[1, 2, 3, 4, 5]
在Knex中,当我们需要使用多个问号占位符时,可以在查询字符串中使用多个?
,然后把需要传递的参数作为数组在knex.raw()
函数的第二个参数传递进去。在处理可选参数和可变参数时,我们可以使用ES6的展开语法来处理它们。