TypeORM(MySQL)使用take()时关联实体缺失问题求助
TypeORM关联查询中take(10)导致关联照片无法映射的原因分析
核心原因:TypeORM实体映射依赖关联实体的主键
TypeORM在将SQL查询结果映射到实体对象时,必须依靠关联实体的主键来识别、区分并分组关联数据。
在你的查询中,只选择了photos.url和photos.timestamp,没有包含photos.id:
- 当没有
take(10)时,查询返回全量结果,TypeORM能通过底层隐式逻辑(比如结果集行顺序、user_id关联关系)临时完成映射,但这并非可靠的规范行为; - 当加上
take(10)后,查询变为分页查询,TypeORM的映射逻辑会严格依赖主键来合并关联数据。缺少photos.id时,TypeORM无法判断不同的Photo记录归属,也无法把零散的url、timestamp字段组装成合法的Photo实体对象,最终导致User实体的photos数组为空。
为什么原始结果能看到照片但实体里没有?
你的原始SQL查询确实会返回包含user和photo字段的行,但这些只是数据库返回的原始数据。TypeORM需要将这些行转换为符合实体结构的对象,这个转换过程必须依赖主键做关联绑定:没有Photo主键,TypeORM无法把零散的photo字段绑定到对应的Photo实体,自然也就无法关联到User的photos数组中。
解决办法
在select列表中明确加入photos.id,让TypeORM能正确完成映射:
const users = await userRepo .createQueryBuilder('user') .leftJoin('user.photos', 'photos') .select([ 'user.id', 'photos.id', // 必须包含关联实体主键 'photos.url', 'photos.timestamp', ]) .take(10) .getMany();
内容的提问来源于stack exchange,提问作者furkan dogu
相关产品推荐
相关产品推荐

