📌  相关文章
📜  knex 原始多个 '?' (1)

📅  最后修改于: 2023-12-03 15:32:28.841000             🧑  作者: Mango

Knex原始多个'?'介绍

在使用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));

在上面的例子中,我们使用了三个可选参数nameageemailnameemail都是必需的参数,但age是可选的,可能为null,表示这个条件不需要加入查询中。我们使用一个数组conditions来表示查询中需要加入的条件,然后使用一个数组params来表示这些条件对应的参数。在生成查询语句时,我们使用了filter(Boolean)函数来过滤掉nullundefined值。最终的查询语句和参数数组如下所示:

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的展开语法来处理它们。