NodeJS 使用一个值筛选多个列的Typeorm查询生成器

x4shl7ld  于 2022-11-03  发布在  Node.js
关注(0)|答案(3)|浏览(289)

我的目标是命中api端点,只传递一个查询变量,并尝试基于单个变量过滤掉任何列。
我在数据库中有多个用户,例如:

{
  id: 1,
  email: 'test+1@test.com',
  username: 'test',
  phone_number: '+651231231',
  skillsets: 'Drawing, cooking',
  hobby: 'Sleeping',
},
{
  id: 2,
  email: 'test+2@test.com',
  username: 'test 2',
  phone_number: '+6512312311231',
  skillsets: 'Drawing, cooking',
  hobby: 'Drawing',
}

我的职能/查询

let users = this.repo.createQueryBuilder('user');

    if (query && query !== '') {
      users = users
        .where('user.email like :email', { email: `%${query}%` })
        .orWhere('user.username like :username', {
          username: `%${query}%`,
        })
        .orWhere('user.phone_number like :phone_number', {
          phone_number: `%${query}%`,
        })
        .orWhere('user.skillsets like :skillsets', {
          phone_number: `%${query}%`,
        })
        .orWhere('user.hobby like :hobby', { hobby: `%${query}%` });
    }

    return users.getMany();

我的api端点应该类似于

/api/users?query=Sleeping

我不能过滤除电子邮件以外的任何其他东西,我认为是因为最初的地方,但我不完全确定如何迎合这种情况。
如果有人能给我指出正确的方向,我很感激。

beq87vna

beq87vna1#

我希望实现类似的功能,并在另一个Stackoverflow Question中找到了答案
可以使用简单的typeorm.find()选项来使用OR子句,如TypeORM docs中所述。要使用OR运算符进行查询,您需要使用条件数组而不是对象。

let users = await user.find({
    where: [
        { email: Like(%${query}%) },
        { skillsets: Like(%${query}%) },
        { username: Like(%${query}%) }
    ]
});
nszi6y05

nszi6y052#

您可以尝试类似的方法。只需添加其他列。

users = users
        .where('user.email like :query AND (user.username like :query OR user.phone_number like :query)', { query: `%${query}%` })
p4tfgftt

p4tfgftt3#

您可以使用查询生成器中的setParameter函数,并在传递参数键的任何地方使用该值。因此,您可以像这样改进代码:

const users = this.repo.createQueryBuilder('user');

    if (query) {
      users
        .where('user.email LIKE :query')
        .orWhere('user.username LIKE :query')
        .orWhere('user.phone_number LIKE :query')
        .orWhere('user.skillsets LIKE :query')
        .orWhere('user.hobby LIKE :query')
        .setParameter('query', `%${query}%`);
    }

return users.getMany();

希望这对你有帮助。

相关问题