Typeorm中join关联查询后如何保留关联实体的自定义辅助方法
你的推测是正确的,TypeORM 关联查询返回的关联对象默认如果是纯POJO(普通JavaScript对象),没有绑定对应实体类的原型链,就会丢失自定义类方法。可通过以下几种方案解决:
方案1:调整查询方法,直接获取实体实例
使用 find 系列查询方法,或者使用 QueryBuilder 时调用 getOne/getMany 而非 getRawOne/getRawMany,默认就会返回实体类实例,关联对象也会自动实例化:
// 示例:QueryBuilder 正确写法 const user = await userRepository.createQueryBuilder('user') .leftJoinAndSelect('user.book', 'book') .getOne() // 示例:find 方法写法 const user = await userRepository.findOne({ where: { id: 1 }, relations: ['book'] })
此时 user.book 自动为 BookEntity 实例,可直接调用 myCustomMethod 方法。
方案2:使用 Repository 的 create 方法手动实例化
如果查询得到的确实是纯对象,可以用对应实体的 Repository 提供的 create 方法,将纯对象转为实体实例:
user.book = bookRepository.create(user.book) // 之后即可正常调用自定义方法 user.book.myCustomMethod()
方案3:使用 class-transformer 转换
你也可以用 class-transformer 库的 plainToInstance 方法手动做转换,适合没有对应 Repository 可用的场景:
import { plainToInstance } from 'class-transformer' user.book = plainToInstance(BookEntity, user.book) user.book.myCustomMethod()
注意:如果查询时指定了返回部分字段,转换后的实例仅会包含你查询的字段,其余字段为 undefined,但自定义方法依然可以正常调用。
内容的提问来源于stack exchange,提问作者rksh1997
相关产品推荐
相关产品推荐

