我目前在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.wrap
,knex.as
等尝试提供更清晰的选项时我遇到了一些不可转换的东西,或者我只是不知道如何写它。
我知道knex.js除了insert之外什么都不支持VALUES
,所以必须是原始的,但其他的东西应该是可能的
答案 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逻辑以自动包装查询和嵌套占位符。