如何在NestJS中使用Not或!=操作符?查询返回空数组求解
解决NestJS中TypeORM关联查询返回空数组的问题
排查与修复步骤
1. 确认Not操作符的正确导入
首先确保你已经从TypeORM中导入了Not操作符,否则查询条件会直接失效:
import { Not } from 'typeorm';
2. 匹配ID的数据库字段类型
如果你的catalogue表中id是数字类型,而传入的参数是字符串,必须先做类型转换,否则会因类型不匹配查不到数据:
async getAllPhoto(id: string) { // 转换为数字(根据你的数据库字段类型调整,比如UUID则无需转换) const targetId = Number(id); if (isNaN(targetId)) { throw new Error('无效的分类ID'); } const photos = await this._photoRepository.find({ relations: { catalogue: true }, where: { catalogue: { id: Not(targetId) } }, }); return photos; }
3. 验证实体关联关系定义
检查Photo与Catalogue的实体关联是否配置正确,比如Photo实体中的关联字段:
// photo.entity.ts import { Entity, PrimaryGeneratedColumn, ManyToOne } from 'typeorm'; import { Catalogue } from './catalogue.entity'; @Entity() export class Photo { @PrimaryGeneratedColumn() id: number; // 确保@ManyToOne的关联指向正确,反向关联字段(如果有)配置无误 @ManyToOne(() => Catalogue, (catalogue) => catalogue.photos) catalogue: Catalogue; }
4. 可选:改用QueryBuilder查询(更直观易排查)
如果find方法的嵌套条件仍有问题,用QueryBuilder重构查询逻辑会更清晰,也更容易定位问题:
async getAllPhoto(id: string) { const targetId = Number(id); if (isNaN(targetId)) { throw new Error('无效的分类ID'); } const photos = await this._photoRepository .createQueryBuilder('photo') .leftJoinAndSelect('photo.catalogue', 'catalogue') .where('catalogue.id != :id', { id: targetId }) // 若需要包含未关联任何分类的图片,添加OR条件 // .orWhere('photo.catalogue IS NULL') .getMany(); return photos; }
5. 特殊场景处理
如果存在未关联任何Catalogue的Photo(即catalogue字段为null),且你希望这类数据也被返回,需要在查询条件中补充OR规则:
// find方法的写法 const photos = await this._photoRepository.find({ relations: { catalogue: true }, where: [ { catalogue: { id: Not(targetId) } }, { catalogue: null } ], });
内容的提问来源于stack exchange,提问作者hassen mohamed
相关产品推荐
相关产品推荐

