如何将此原始查询转换为knex native?

时间:2017-10-15 07:05:55

标签: javascript knex.js

我目前在knex.js中有一个使用knex.raw的手动编写的查询:

db.raw(`SELECT * FROM 
(VALUES ${Array(ids.length).fill('(?)').join(',')}) v (__whereId)
LEFT JOIN LATERAL
(SELECT * FROM ?? WHERE ?? = v.__whereId ORDER BY ?? ASC LIMIT 2) t
ON true`,
[...ids, table, `${table}.${field}`, primaryKey])

我希望将其转换为使用尽可能多的knex.js内置内容,但每次我尝试使用knex.wrapknex.as等尝试提供更清晰的选项时我遇到了一些不可转换的东西,或者我只是不知道如何写它。

我知道knex.js除了insert之外什么都不支持VALUES,所以必须是原始的,但其他的东西应该是可能的

1 个答案:

答案 0 :(得分:0)

我设法找到了自己问题的解决方案:

    const values = db.raw(`(VALUES ${Array(ids.length).fill('(?)').join(',')}) AS v (__whereId)`, ids);
    const sub = db.table(table).whereRaw('??.?? = v.__whereId', [table, field]).orderBy(primaryKey, 'asc').limit(2).as('t');
    const query = db.from(values).joinRaw('left join lateral ? on true', sub).select();

最后一部分是有趣的部分 - 显然在原始输入中使用?,并提供子查询作为占位符的参数,触发一些内部knex逻辑以自动包装查询和嵌套占位符。