TypeORM中如何无需关联表即可查询外键列?
TypeORM中如何无需关联表即可查询外键列?
嘿,我来帮你解决这个问题~你遇到的核心问题是不想通过关联user表来获取外键userId,毕竟加载整个用户实体确实没必要,会增加查询成本。这里有两个简单的方案:
方案一:在实体中显式定义外键字段
你可以在Book实体里直接添加userId属性,和现有的user关联字段共存,这样TypeORM就能直接映射数据库里的userId列,不需要关联查询:
首先修改你的Book实体:
import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { User } from "./User"; @Entity() export class Book { // 其他字段(比如id、title等)... @Column() userId: number; // 新增这个字段,映射数据库的userId列 @ManyToOne(() => User, (user) => user.books) @JoinColumn({ name: 'userId' }) // 指定关联的列就是上面的userId user: User; }
然后查询的时候就可以直接指定userId作为条件,同时选择这个字段,完全不需要relations:
const books = await this.repository.find({ where: { userId: userId }, // 直接用userId筛选 select: ['id', 'title', 'userId'], // 显式选择需要的字段,包括userId });
这样查询出来的books数组里每个对象都会有userId属性,而且不会触发JOIN查询,性能更优。
方案二:使用QueryBuilder灵活查询
如果你不想修改实体结构,也可以用TypeORM的QueryBuilder来直接查询数据库列,绕过实体的关联限制:
const books = await this.repository.createQueryBuilder('book') .select(['book.id', 'book.title', 'book.userId']) // 直接指定数据库里的userId列 .where('book.userId = :userId', { userId }) .getMany();
这种方式不需要在实体里定义userId属性,直接通过SQL层面的查询获取外键值,同样不会关联user表,非常灵活。
补充说明
你之前的代码里用了relation: ['user'](应该是relations,拼写小错误),TypeORM会自动执行JOIN操作来加载整个user实体,这就是导致查询成本高的原因。上面的两种方案都避免了JOIN,只查询你需要的userId列,完全满足你“检查书籍是否属于请求者”的需求。
备注:内容来源于stack exchange,提问作者Affection77
相关产品推荐
相关产品推荐

