乐闻世界logo
搜索文章和话题

如何从NestJS/TypeORM中的Parent联接字段访问关系ID

2 个月前提问
1 个月前修改
浏览次数17

1个答案

1

在NestJS结合TypeORM的项目中,处理关系数据是非常常见的一部分。例如,你可能有一个Parent实体和一个Child实体,每个Parent可以有多个Child。当你需要访问从ParentChild的关系ID时,有几种方法可以实现这一点。

方法1:使用@JoinColumn和实体字段

假设你的ParentChild实体定义如下:

typescript
@Entity() export class Parent { @PrimaryGeneratedColumn() id: number; @OneToMany(() => Child, child => child.parent) children: Child[]; } @Entity() export class Child { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => Parent, parent => parent.children) @JoinColumn({ name: 'parentId' }) parent: Parent; @Column() parentId: number; }

在上述代码中,Child实体通过parentId字段直接存储了与Parent的关联ID。这意味着你可以直接通过child.parentId访问该ID,无需通过parent对象。这是因为我们在Child实体中添加了一个额外的列parentId来显式存储这个关系的键。

方法2:通过查询构建器

如果你没有在实体中直接定义关联ID作为字段,你仍然可以通过创建一个查询来访问这些ID。使用TypeORM的查询构建器,可以这么做:

typescript
const childrenWithParentIds = await this.childRepository .createQueryBuilder('child') .leftJoinAndSelect('child.parent', 'parent') .select(['child.id', 'parent.id AS parentId']) .getMany();

在这个例子中,我们没有在Child实体中定义parentId,而是通过连接Parent并在查询中选择parent.id来动态获取。这将返回一个包含子项ID和对应父项ID的列表。

方法3:使用实体管理器或存储库加载关系

当你加载一个实体时,你也可以选择加载其关系的部分或全部数据。例如:

typescript
const parentWithChildren = await this.parentRepository.findOne({ where: { id: parentId }, relations: ['children'] });

这将加载Parent及其所有Child。然后,你可以遍历children数组来访问每个Childidparent属性。

总结

在实际应用中,选择哪种方法取决于你的具体需求,比如性能考虑、数据结构的复杂性以及是否需要频繁访问关系ID。直接在实体中包含关系ID可以提高效率,因为不需要额外的JOIN操作就能直接访问这些ID。然而,使用查询构建器或实体关系加载可以提供更多的灵活性和动态数据处理能力。

2024年7月31日 00:47 回复

你的答案