求助:在TypeORM中实现含AND与OR组合条件的用户查询
解决TypeORM中AND与OR组合条件的查询问题
要实现你需要的name = 'user18' AND (name LIKE '%搜索词%' OR email LIKE '%搜索词%')组合条件,需利用TypeORM的Brackets类分组OR逻辑,同时通过参数绑定保证查询安全。修改后的完整代码如下:
import { Brackets } from "typeorm"; async getUsers(@Query() queryParams: any): Promise<{ data: user[]; total: number }> { let { page = 1, limit = 10, search = '', sort_by = 'id', sort_order = 'desc', name = 'user18' } = queryParams; const options: FindManyOptions<user> = { order: { [sort_by]: sort_order }, take: limit, skip: page ? (page - 1) * limit : 0, where: new Brackets(qb => { // 外层AND条件:精确匹配name qb.where("name = :name", { name }) // 内层OR组合条件:name或email匹配搜索词 .andWhere(new Brackets(innerQb => { innerQb.where("name LIKE :search", { search: `%${search}%` }) .orWhere("email LIKE :search", { search: `%${search}%` }); })); }) }; const [data, total] = await this.usersRepository.findAndCount(options); return { data, total }; }
关键改动说明
- 用
Brackets实现条件分组:TypeORM的对象式where仅支持AND关系,要实现OR分组必须通过Brackets嵌套。外层Brackets确保name精确匹配与内层OR组合为AND关系,内层Brackets包裹name和email的模糊匹配逻辑,完全对应你期望的SQL结构。 - 参数绑定避免SQL注入:所有变量通过参数占位符(
:name、:search)传递,搜索词的%拼接放在参数值中,而非直接写入SQL字符串,杜绝注入风险。 - 灵活适配参数来源:如果
name需要从查询参数动态获取,直接保留解构逻辑即可;若为固定值,将{ name }替换为{ name: 'user18' }即可。
内容的提问来源于stack exchange,提问作者Harshil Solanki
相关产品推荐
相关产品推荐

