我将以下查询转换为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": ":",
.
.
.
在此先感谢您的启发。 皮特
答案 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);
});
});