NestJS+TypeORM(MySQL)查询分类表时关联搜索用户firstName报错如何解决
TypeORM关联表字段搜索实现方案
报错原因
你直接在WHERE条件中使用category.user.firstName访问关联表字段会报错,是因为TypeORM的QueryBuilder不会自动关联关联表,必须先显式执行关联操作,才能对关联表的字段做筛选。
前置验证
首先确认你的Category实体类已经正确配置了和User实体的关联关系,示例配置如下:
import { Entity, Column, ManyToOne, JoinColumn } from 'typeorm'; import { User } from './user.entity'; @Entity('categories') export class Category { // 其他字段... @ManyToOne(() => User) @JoinColumn({ name: 'userid' }) // name值对应categories表中存储用户ID的外键字段名 user: User; }
正确查询代码
const query = this.createQueryBuilder('category'); // 显式关联user表,指定别名为user query.leftJoin('category.user', 'user'); // 分类名称搜索(原有逻辑无需修改) if (categoryName) { query.andWhere('category.categoryName LIKE :categoryName', { categoryName: `%${categoryName}%`, }); } // 关联用户firstName搜索,使用关联时定义的user别名访问字段 if (userName) { query.andWhere('user.firstName LIKE :userName', { userName: `%${userName}%`, }); } // 执行查询,可根据需求替换为getOne、getRawMany等方法 return query.getMany();
补充说明
- 如果只需要返回存在对应用户的分类,可以将
leftJoin替换为innerJoin,自动过滤无关联用户的分类数据 - 如果需要在返回结果中同步返回关联的用户信息,可以将
leftJoin替换为leftJoinAndSelect('category.user', 'user') - 关联语句中的
category.user必须和Category实体中定义的关联属性名完全一致,别名可自定义,只需和后续WHERE条件中的别名保持一致即可
内容的提问来源于stack exchange,提问作者Dharmik soni
相关产品推荐
相关产品推荐

