TypeORM中如何实现带OR分组的WHERE LIKE查询?
解决TypeORM中AND嵌套OR的查询问题
你当前的代码有两个核心问题:一是where数组的逻辑不符合需求,二是存在拼写错误。TypeORM里where数组的每个对象是OR关系,导致生成的SQL变成area = ? OR name LIKE ? OR address LIKE ?,和你需要的area = ? AND (name LIKE ? OR address LIKE ?)完全不符;另外代码里getReporsitory应为getRepository,connetion应为connection。
下面给出两种正确实现方式:
方式一:使用find方法的嵌套条件
const { DataSource, Equal, Like } = require("typeorm"); // 注意区分area参数和搜索关键词,避免变量混淆 const areaParam = 2; const searchParam = "你的搜索内容"; const data = await connection.getRepository("Users").find({ select: ["id", "name", "address", "sex", "birthday", "area"], // 对应原SQL指定查询字段 where: { area: Equal(areaParam), // TypeORM 0.3.x版本可直接写area: areaParam,Equal可省略 // 嵌套OR条件(部分数据库需用or替代$or,比如PostgreSQL) $or: [ { name: Like(`%${searchParam}%`) }, { address: Like(`%${searchParam}%`) } ] } });
方式二:使用QueryBuilder(推荐,复杂条件更直观)
QueryBuilder写法能完全匹配你要的SQL结构,可读性更强:
const { DataSource } = require("typeorm"); const areaParam = 2; const searchParam = "你的搜索内容"; const data = await connection.getRepository("Users") .createQueryBuilder("user") .select(["user.id", "user.name", "user.address", "user.sex", "user.birthday", "user.area"]) .where("user.area = :area", { area: areaParam }) .andWhere("user.name LIKE :search OR user.address LIKE :search", { search: `%${searchParam}%` }) .getMany();
内容的提问来源于stack exchange,提问作者p3ac3
相关产品推荐
相关产品推荐

