[英]How to convert this raw query to knex native?
我目前在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
,因此必須是原始的,但其他可能也應該可行
我設法找到了自己的問題的解決方案:
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邏輯,以自動正確包裝查詢和嵌套的占位符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.