首页 > 解决方案 > 如何在 Knex.js 中表达“小于或等于”关系

问题描述

在我的后端,我将 KnexJS 与 PostgreSQL 一起使用,我必须使用其 SQL 构建器构建一个 Knex 函数,而无需使用原始 SQL。

这是我第一次使用 KnexJS,我遇到的问题很少。

我必须构建的内容如 SQL 示例所示

 UPDATE
     feed
  SET
     status = 'SOME_STATUS'
  WHERE
     created_at <= 'SOME_TIMESTAMP'
     AND conversation_id = 'ID';

此 SQL 正在更新表提要所有列的状态以及满足两个条件的位置。

在 Knex 中,我尝试了我的想法的示例代码

answerPendingMessages(feeds) {
    return this.tx(tableName).where({
      conversationId,
      createdAt <= timestamp  // This not idea how to do in Knex ???
    }).update({
      status: 'ANSWERED'
    })
  }

在上述函数中,我关心的是如何将 where 部分实际转换为条件之一createdAt <= 'TIMESTAMP'

我知道我可以将 where 与对象一起使用,但不明白如何包含<=

此外,我应该updatedAt使用新的时间戳更新该列,但此刻也阻止了我。

最终结果应该是所有满足条件的列都将状态更新为某种状态,并且还有一个新的 updatedAt 时间戳。

我不确定 Knex 是否有特定的方法可以这样做

标签: sqlpostgresqlknex.js

解决方案


这个答案是为我之前的问题提供我的目标。我展示的脚本没有做任何事情,我不知道如何让它工作。

answerPendingMessages(feeds) {
    if (isEmpty(feeds)) return Promise.resolve([]);
    const { conversationId, createdAt } = feeds;
    return this.tx(tableName)
      .where(
        columns.conversationId === conversationId,
        columns.createdAt <= createdAt
      )
      .update({
        [columns.status]: 'ANSWERED',
        [columns.updatedAt]: new Date(),
      });
  }

这里应该发生的是更新一个我有两个条件但其中一个是“小于或等于”关系的表。

因为这个输出应该是满足 2 个条件的所有行都是更新状态列。

现在脚本没有失败,也没有成功盗版没有发生任何事情。


推荐阅读