使用带有原始

时间:2019-02-06 07:08:50

标签: sqlite knex.js

我已经遍历了knex文档,并尝试了我无法找到的所有可能的组合。但是,使用SQLiteStudio,我可以成功使用多个 ? ...

进行常规查询

select * from 'articles' where LOWER("cover_page") = ? AND "cover_page" != "" AND "user_id" = ?

select * from 'articles' where LOWER("title") = ? AND "title" != "" AND "user_id" = ?

select * from 'articles' where LOWER("link") = ? AND "link" != "" AND "user_id" = ?

...在knex中,如果一次仅使用1 ?,我将获得以下成功:

const doesExist = await db('articles')
    .where(db.raw('LOWER("cover_page") = ?', article.cover_page.toLowerCase()))
    .orWhere(db.raw('LOWER("title") = ?', article.title.toLowerCase()))
    .orWhere(db.raw('LOWER("link") = ?', article.link.toLowerCase()))
    .first();

有人知道如何在AND "user_id" = ? ??

中输入第二个值吗?

目标是输出不返回任何内容...

1 个答案:

答案 0 :(得分:1)

可以。另请参见documentation link

您缺少的键是正确传递参数。请参阅位置数组以传递变量:.whereRaw('LOWER(cover_page) = ? AND LOWER(title) = ?', ['somepage', 'sometitle'])

(我还怀疑您不应该在这种情况下引用数据库字段。)

我还没有执行它,但是应该关闭:

const doesExist = await db('articles')
   .whereRaw('LOWER(cover_page) = ? OR LOWER(title) = ? OR LOWER(link) = ?',
       [article.cover_page.toLowerCase(), 
        article.title.toLowerCase(),
        article.link.toLowerCase()] ) 
   .first();

PS:您也可以使用位置数组将参数传递给raw(),就像我在whereRaw()中使用它一样。