knex查询构建器和链中调用的方法的顺序

时间:2018-05-07 16:48:19

标签: javascript knex.js

阅读knex documentationknex cheat sheet,我发现在提供的示例中.where()总是在表引用后立即调用:

knex('users')
  .where({ id: 2 })
  .update({ name: 'Homer' })
// UPDATE `users` SET `name`='Homer` WHERE `id`=2 

上面的代码看似合乎逻辑,因为在运行.update()之前,整个数据集已缩小。

令我感到困惑的是,交换方法会生成相同的SQL查询:

knex('users')
  .update({ name: 'Homer' }) 
  .where({ id: 2 })
// UPDATE `users` SET `name`='Homer` WHERE `id`=2 

新手可能直观地期望在WHERE之后应用UPDATE,类似于javascript数组方法。

尝试其他示例,例如knex.select().table('books'),通过实验,我发现查询构建器只是“收集”knex.then()之间的所有方法(或者语句),并将它们组成一个单个查询,并运行它

如果有人通过文档链接或其他knex资源确认上述声明,我会完全满意。

1 个答案:

答案 0 :(得分:1)

通常,查询构建器会收集已调用的所有调用的构建器方法,并且调用它们的顺序并不重要。这是因为生成的SQL无法以任何其他顺序生成。

然而,有一些方法,其中调用它们的顺序实际上很重要。最值得注意的是.clearSelect.clearWhere.clearOrder方法http://knexjs.org/#Builder-clear

此外,当多个列在单个语句中更新时,更新顺序实际上反映了输出SET语句的顺序。

可能还有其他一些细微之处,订单确实很重要,但我不相信任何人都曾追查过所有细节。