TypeORM 第二个JOIN语句执行后未返回关联manufacturer数据
问题原因
- 使用
leftJoinAndSelect传入实体类+手动关联条件的写法属于手动自定义关联,TypeORM不会自动将查询到的manufacturer数据挂载到Product实体的对应属性上,只有通过实体预先定义的关联属性做join,查询结果才会自动映射到实体属性中。 - 你提到Product和Manufacturer是n:m关系,但当前Product表中存在单独的
manufacturerId字段,说明要么你的实体关联定义不符合实际表结构,要么实际为1:n关系(一个厂商对应多个产品,一个产品属于一个厂商)。如果确实是n:m关系,你还缺少多对多中间表,也没有在Product实体中定义对应关联属性。
修复方案
情况1:实际为1对多关联(和当前表结构匹配,一个产品仅属于一个厂商)
- 先在Product实体类中补充关联定义
@ManyToOne(() => Manufacturer) @JoinColumn({ name: 'manufacturerId' }) manufacturer: Manufacturer;
- 修改查询代码,通过关联属性做join
CollectionProducts.createQueryBuilder("cp") .innerJoinAndSelect("cp.product", "product") .leftJoinAndSelect("product.manufacturer", "manufacturer") .where("cp.collectionId IN(:...ids)", { ids: collectionIds }) .getMany();
情况2:确实为多对多关联
- 先补多对多关联定义(示例为Product侧代码,可根据需求调整中间表配置)
@ManyToMany(() => Manufacturer) @JoinTable({ name: 'product_manufacturer', // 你的多对多中间表名称 joinColumn: { name: 'productId', referencedColumnName: 'id' }, inverseJoinColumn: { name: 'manufacturerId', referencedColumnName: 'id' } }) manufacturers: Manufacturer[];
- 修改查询代码
CollectionProducts.createQueryBuilder("cp") .innerJoinAndSelect("cp.product", "product") .leftJoinAndSelect("product.manufacturers", "manufacturer") .where("cp.collectionId IN(:...ids)", { ids: collectionIds }) .getMany();
快速兼容方案(无需修改实体定义)
如果不想改动现有实体配置,可以改用getRawMany获取原始查询结果,手动组装数据结构即可:
const rawData = await CollectionProducts.createQueryBuilder("cp") .innerJoinAndSelect("cp.product", "product") .leftJoinAndSelect( Manufacturer, "manufacturer", "product.manufacturerId = manufacturer.id" ) .where("cp.collectionId IN(:...ids)", { ids: collectionIds }) .getRawMany(); // 后续手动将manufacturer相关字段合并到product对象中即可
内容的提问来源于stack exchange,提问作者JonathanWdl
相关产品推荐
相关产品推荐

