使用 Knex 查询构建器构建动态 SELECT 语句

时间:2021-05-26 06:52:39

标签: javascript node.js knex.js

我有以下代码

switch (aggregation) {
    case "year":
        select = { year: "%Y" };
        break;
    case "month":
        select = { year: "%Y", month: "%m" };
        break;
    default: // day
        select = { date_eng: "%Y-%m-%d", date_ger: "%d.%m.%Y" };
}

我想做这样的事情:

await knex.transaction(trx => {
    return trx
    .select([

        for (let [key, value] of Object.entries(select)) {
            knex.raw(`DATE_FORMAT(\`created_at\`, '${key}') AS ${value}`),
        }
    ])
    .count('id AS total')
    .from(`tablename`)
    .where(builder => {
        builder.whereBetween('created_at', [datetime_start, datetime_end])
    })
})

有人知道我该如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

你应该返回一个包含值的数组,

await knex.transaction((trx) => {
  return trx
    .select(
      Object.entries(select).map(([key, value]) =>
        knex.raw('DATE_FORMAT(??, '?') AS ??', ['created_at' ,value, key])
      )
    )
    .count('id AS total')
    .from(`tablename`)
    .where((builder) => {
      builder.whereBetween('created_at', [datetime_start, datetime_end]);
    });
});