如何执行类似的查询 TypeORM
How to perform a like query TypeORM
大家好,我正在尝试查找其中包含 a 的所有结果。我尝试了几种方法,但问题是什么都不管用。它只是 returns 一个空数组
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
功能。示例 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}%`)
});
您也可以使用数据库函数进行拼接。例如在 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();
我就是这样做的。希望对你有帮助
使用存储库我把它放在 哪里 例如 :
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,
},
});
似乎所有的答案,包括 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();
Un-sanitized 来自用户的包含 %
字符的数据被发送到上述查询中的 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()
大家好,我正在尝试查找其中包含 a 的所有结果。我尝试了几种方法,但问题是什么都不管用。它只是 returns 一个空数组
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
功能。示例 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}%`)
});
您也可以使用数据库函数进行拼接。例如在 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();
我就是这样做的。希望对你有帮助
使用存储库我把它放在 哪里 例如 :
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,
},
});
似乎所有的答案,包括 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();
Un-sanitized 来自用户的包含 %
字符的数据被发送到上述查询中的 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()