使用NestJS+TypeORM+MongoDB时官方一对一关联示例不生效问题
问题修复方案
1. 关联注解适配MongoDB场景
你当前使用的@JoinColumn是为关系型数据库设计的外键注解,不适用MongoDB文档数据库场景,需要替换为@JoinProperty注解来标识关联文档的存储属性:
修改user.entity.ts代码:
import { JoinProperty } from 'typeorm'; @OneToOne(() => Office, office => office.user) @JoinProperty() // 替换原有的@JoinColumn注解 office: Office;
2. 修正保存逻辑的实体实例处理
你传入save方法的user是前端传入的普通对象,并非TypeORM的实体实例,缺少关联关系对应的元数据,导致TypeORM无法正确持久化office关联字段。需要先通过仓库的create方法将普通对象转为实体实例再操作:
修改保存逻辑代码:
const officeId = "615c190d9a99101c6ca6cf43" const officeObject = await this.officesService.findOne(officeId); // 将请求传入的普通user对象转为TypeORM实体实例 const userEntity = this.usersRepository.create(user); userEntity.office = officeObject; const createdUser = await this.usersService.save(userEntity);
3. 优化查询参数
查询时select字段不需要显式声明office,配置relations: ['office']后TypeORM会自动加载关联的Office文档:
修改查询代码:
const users = await this.usersRepository.find({ select: ['id', 'firstName', 'lastName', 'email', 'role'], relations: ['office'] });
完成以上修改后,查询返回的用户列表就会携带完整的关联办公室信息。
内容的提问来源于stack exchange,提问作者shAkur
相关产品推荐
相关产品推荐

