You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:19:52