多个链接的knex连接更改输出格式

时间:2019-12-20 17:32:14

标签: javascript json join knex.js

我将以下查询转换为knex。

select e.email, p.id, a.started
from person p join gift g on p.id = g.user
    join ants a on g.latest = a.id
    join emailant e on p.id = e.user
group by p.id
having MAX(TIMESTAMPDIFF(DAY, a.created, now(6))) > 0;

knex版本:

let sql: QueryBuilder = knex 
        .select('e.email as Email', 'p.id', 'a.started')
        .from ('person as p') 
        .join('gift as g', 'p.id', '=', 'g.person') . // Works to this point
        .join('emailants as e','p.id', '=', 'e.person') // Output changes here
        .join('ants as a', 'g.latest', '=', 'a.id')
        .groupBy('p.id')
        .havingRaw('MAX(TIMESTAMPDIFF(DAY, a.started, now(6))) > ?', [0]);  
return sql.map((row: any) => { 
  const elementObj = {"elements": row};
    return JSON.stringify(elementObj);
});  

但是,在第二次联接之后,输出看起来不像JSON,而是一个字符数组。

{
  "0": "{",
  "1": "\"",
  "2": "e",
  "3": "l",
  "4": "e",
  "5": "m",
  "6": "e",
  "7": "n",
  "8": "t",
  "9": "s",
  "10": "\"",
  "11": ":",
  "12": "{",
  "13": "\"",
  "14": "E",
  "15": "m",
  "16": "a",
  "17": "i",
  "18": "l",
  "19": "\"",
  "20": ":",
.
.
.
  1. 我是否正确使用链式联接?
  2. 在链中是否还需要使用另一种knex方法来解决此问题?
  3. 我应该改用knex.raw方法吗?

在此先感谢您的启发。 皮特

1 个答案:

答案 0 :(得分:0)

作为knex API的一部分,不再有map,因此,您需要await的结果,然后在其上进行映射。

let sql = knex
  .select('e.email as Email', 'p.id', 'a.started')
  .from('person as p')
  .join('gift as g', 'p.id', '=', 'g.person') // Works to this point
  .join('emailants as e', 'p.id', '=', 'e.person') // Output changes here
  .join('ants as a', 'g.latest', '=', 'a.id')
  .groupBy('p.id')
  .havingRaw('MAX(TIMESTAMPDIFF(DAY, a.started, now(6))) > ?', [0]);

return sql.then((rows) => {
  // -------^
  return rows.map((row) => { 
    const elementObj = {"elements": row};
    return JSON.stringify(elementObj);
  });
});