[英]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();
似乎包括 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.