是否可以在bookshelf.js查询中多次使用orWhereRaw?

时间:2016-05-31 17:20:06

标签: javascript bookshelf.js knex.js

我正在尝试创建一个允许用户通过多个参数进行搜索的功能。这是代码。

async function searchUsers(searchText) {
  if(isNaN(searchText)){
    searchText = "'%" + searchText + "%'";
  } else {
    searchText = searchText;
  }

  let results = await User.query({whereRaw: ' (`firstName` LIKE ' + searchText , orWhereRaw: '`lastName` LIKE ' + searchText
    , orWhereRaw: '`username` LIKE' + searchText, orWhereRaw: '`providerId` =' + searchText + ")"}).fetchAll();

  return results.toJSON();
}

现在运行此函数时,这就是我在命令行中看到的内容。

sql: 'select `users`.* from `users` where  (`firstName` LIKE 1 or `providerId` =1)' }

您可以清楚地看到查询仅包含firstName和providerId。没有提到lastName或用户名。

如何包含所有参数?

1 个答案:

答案 0 :(得分:0)

您的错误是在同一对象中使用相同的密钥两次。第二个覆盖了第一个。

assert.deepEqual({ a: true }, { a: false, a: true });

使用linter来防止出现此类问题。

解决方案:

let results = await User.query(queryBuilder => queryBuilder
  .whereRaw('`firstName` LIKE ?', searchText)
  .orWhereRaw('`lastName` LIKE ?', searchText)
  .orWhereRaw('`username` LIKE ?', searchText)
  .orWhereRaw('`providerId` = ?', searchText)
).fetchAll();

虽然不会产生你想要的括号。对于您正在做的事情,您不需要任何原始查询。这是非常标准的东西。

let results = await User
  .where('firstName', 'like', searchText)
  .orWhere(function () {
    this.where('firstName', 'like', searchText)
      .orWhere('lastName' 'like', searchText)
      .orWhere('username', 'like', searchText)
      .orWhere('providerId', searchText)
    });
  )
).fetchAll();

有关详细信息,请参阅Knex docs