簡體   English   中英

如何將此原始查詢轉換為knex本機?

[英]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.wrapknex.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM