繁体   English   中英

如何执行类似的查询 TypeORM

[英]How to perform a like query TypeORM

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

但没有任何效果。 所有这些都返回给我一个空数组。 有人可以帮我吗谢谢

正确的做法是:

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

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}%`)
});

似乎包括 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()

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

  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();

但没有任何效果。 所有这些都给我返回了一个空数组。 有人可以帮我吗谢谢

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

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

我就是这样做的。 希望能帮助到你

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM