如何在TypeORM/NestJS关联查询中使用计算属性?
解决TypeORM查询中无法调用实体getter属性的问题
报错的核心原因是:cover_photo_link并非数据库表中的实际列,它是你在实体类里定义的getter方法,而TypeORM的select选项仅支持指定数据库中存在的字段,直接将其写入select会触发找不到属性的错误。
下面提供两种可行的解决方式:
方法一:直接使用实体的getter属性(推荐)
查询时只需选中cover_photo字段(getter方法依赖该字段的值),查询完成后,每个destination实体实例可直接访问cover_photo_link属性,无需在select中声明:
const data = await dataRepository.find({ relations: { destination: true, }, select: { destination: { id: true, name: true, cover_photo: true, // 仅需选中数据库实际存在的列 }, }, }); // 使用时直接访问getter属性 data.forEach(item => { console.log(item.destination.cover_photo_link); // 正常生成并获取链接 });
方法二:用QueryBuilder手动拼接链接(适合查询阶段生成的场景)
如果需要在数据库查询时就生成链接(比如直接返回给前端的DTO需要包含该字段),可以通过QueryBuilder的addSelect手动拼接字符串:
const data = await dataRepository .createQueryBuilder('main') .leftJoinAndSelect('main.destination', 'destination') .select([ 'main.id', // 根据主实体需求调整字段 'destination.id', 'destination.name', 'destination.cover_photo', // PostgreSQL语法:用||拼接字符串 `'http://127.0.0.1:3000/assets/uploads/destinations/' || destination.cover_photo AS cover_photo_link` ]) .getMany();
注意:不同数据库的字符串拼接语法不同,若使用MySQL,需替换为CONCAT函数:
`CONCAT('http://127.0.0.1:3000/assets/uploads/destinations/', destination.cover_photo) AS cover_photo_link`
这种方式下,查询结果的destination对象会直接包含cover_photo_link字段,可直接使用。
内容的提问来源于stack exchange,提问作者user15539888
相关产品推荐
相关产品推荐

