typescript 如何执行类似查询TypeORM

z0qdvdin  于 2023-02-05  发布在  TypeScript
关注(0)|答案(6)|浏览(171)

大家好,我正在尝试查找所有包含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();

但是什么都不起作用。2所有这些都返回给我一个空数组。3有人能帮我吗,谢谢

mpgws1up

mpgws1up1#

正确的做法是:

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

mfuanj7w2#

TypeORM提供开箱即用的Like函数。示例来自他们的文档:

import {Like} from "typeorm";

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

在您情况下:

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

3bygqnnd3#

您也可以使用数据库函数进行连接,例如:

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

8e2ybdfx4#

看起来所有的答案(包括pleerock接受的答案)都容易受到SQL注入的攻击,除非用户输入事先经过了净化。

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

上述代码在TypeORM中有效的事实使得这种风格的任何查询都容易受到数据泄漏的攻击。

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

来自包含%字符的用户的未净化数据在上述查询中被发送到firstName(例如let firstName = '%John'),这将允许用户泄露关于其他用户的潜在私有数据。
因此,在用例允许的情况下,应该确保任何用户输入都经过净化,任何特殊字符都被删除。
或者,在MySQL中,当用例要求文本中存在特殊字符时,全文搜索可能更合适,但这需要更高的维护成本。
在相关列上创建全文搜索并执行查询

export class User {
        @PrimaryGeneratedColumn()
        id: number;

        @Index({fulltext: true})
        @Column()
        name: string;
    }

    const data = await this.repository
         .createQueryBuilder()
         .select()
         .where('MATCH(name) AGAINST (:name IN BOOLEAN MODE)', {name: name})
         .getOne()
i1icjdpr

i1icjdpr5#

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

我就是这么做的希望能帮上忙

axzmvihb

axzmvihb6#

使用仓库我把它放在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,
      },
    });

相关问题