阅读knex documentation和knex 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资源确认上述声明,我会完全满意。
答案 0 :(得分:1)
通常,查询构建器会收集已调用的所有调用的构建器方法,并且调用它们的顺序并不重要。这是因为生成的SQL无法以任何其他顺序生成。
然而,有一些方法,其中调用它们的顺序实际上很重要。最值得注意的是.clearSelect
,.clearWhere
和.clearOrder
方法http://knexjs.org/#Builder-clear
此外,当多个列在单个语句中更新时,更新顺序实际上反映了输出SET
语句的顺序。
可能还有其他一些细微之处,订单确实很重要,但我不相信任何人都曾追查过所有细节。