【问题标题】:How to perform a like query TypeORM如何执行类似查询 TypeORM
【发布时间】:2018-05-28 14:42:27
【问题描述】:

大家好,我正在尝试查找其中包含 a 的所有结果。我尝试了几种方法,但问题是没有任何效果。它只是返回一个空数组

var data = await getRepository(User)
  .createQueryBuilder("user")
  .where("user.firstName = %:name%", { name: firstName })
  .getMany();

类似的东西

var data = await getRepository(User)
  .createQueryBuilder("user")
  .where("user.firstName like %:name%", { name: firstName })
  .getMany();

但没有任何效果。所有这些都给我一个空数组。谁能帮帮我谢谢

【问题讨论】:

    标签: javascript typescript typeorm


    【解决方案1】:

    正确的做法是:

     var data = await getRepository(User)
                      .createQueryBuilder("user")
                      .where("user.firstName like :name", { name:`%${firstName}%` })
                      .getMany();
    

    【讨论】:

    • 这会正确逃脱firstName吗?
    • 我测试过...我认为它确实参数化了它。
    • @user3413723 我刚刚测试了这个。它会转义引号和其他字符,但不会(也不能)转义“%”和“_”字符。
    • SQL注入!!!
    【解决方案2】:

    TypeORM 提供开箱即用的Like 功能。示例from their docs:

    import {Like} from "typeorm";
    
    const loadedPosts = await connection.getRepository(Post).find({
        title: Like("%out #%")
    });
    

    在你的情况下:

    var data = await getRepository(User).find({
        name: Like(`%${firstName}%`)
    });
    

    【讨论】:

    • 如果您像我一样来这里寻找ilike,它似乎将在即将发布的版本中推出:github.com/typeorm/typeorm/pull/5828
    • 如果 firstName 不是一个安全值,则您的解决方案无法防止 SQL 注入
    • @LucaRoverelli 如何使其免受 sql 注入的影响?是否可以使用相同的语法?
    【解决方案3】:

    您还可以使用数据库函数进行连接。例如在 postgres 中:

     var data = await getRepository(User)
                  .createQueryBuilder("user")
                  .where("user.firstName like '%' || :name || '%'", {name: firstName })
                  .getMany();
    

    【讨论】:

      【解决方案4】:
      var data = await  getRepository(User)
                              .createQueryBuilder("user")
                              .where("user.firstName ILIKE %q, {q:`%${VALUE_HERE}%` })
                      .getMany();
      

      我就是这样做的。希望对你有帮助

      【讨论】:

      • 这很容易受到sql注入。
      【解决方案5】:

      使用存储库,我将它放在 where 中,例如:

      await this.userRepository.findAndCount({
            relations: ['roles', 'company'],
            where: `(username like '%${seachValue}%' or firstname like '%${seachValue}%' 
            or lastname like '%${seachValue}%' or email like '%${seachValue}%')`,
            order: {
              [sortField]: sortDirection,
            },
          });
      

      【讨论】:

      • 您不应该手动插入值。您的代码容易受到 SQL 注入的影响
      • 替换它的最佳方法是什么?
      • 使用查询参数。我会更新你的答案以使用查询参数。
      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多