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

TypeORM 如何从联接表中选择字段?

4 个月前提问
3 个月前修改
浏览次数31

1个答案

1

在使用 TypeORM 进行数据库操作时,如果你需要从联接表(即包含外键关联的表)中选择特定的字段,可以使用QueryBuilder来构建复杂的查询,其中可以包括联接、选择特定字段等功能。下面我会展示一个具体的例子,说明如何使用QueryBuilder来实现从联接表中选择字段。

假设我们有两个实体:UserPhoto,它们通过一个联接表 PhotoMetadata 相关联。User 实体有基本的用户信息,Photo 实体包含照片信息,而 PhotoMetadata 包含了与照片相关的元数据信息。

实体定义

首先,定义这三个实体:

typescript
@Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(() => Photo, photo => photo.user) photos: Photo[]; } @Entity() export class Photo { @PrimaryGeneratedColumn() id: number; @Column() title: string; @ManyToOne(() => User, user => user.photos) user: User; @OneToOne(() => PhotoMetadata, photoMetadata => photoMetadata.photo) metadata: PhotoMetadata; } @Entity() export class PhotoMetadata { @PrimaryGeneratedColumn() id: number; @Column() description: string; @OneToOne(() => Photo, photo => photo.metadata) @JoinColumn() photo: Photo; }

使用QueryBuilder进行查询

接下来,如果我们想从 PhotoMetadata 表中选择 description 字段,同时获取与之相关联的 Phototitle 和其所属 Username,我们可以使用以下QueryBuilder:

typescript
import { getRepository } from "typeorm"; async function getPhotoInformation() { const photoRepository = getRepository(Photo); const photos = await photoRepository .createQueryBuilder("photo") .leftJoinAndSelect("photo.metadata", "metadata") .leftJoinAndSelect("photo.user", "user") .select([ "photo.title", "metadata.description", "user.name" ]) .getMany(); return photos; }

在这个查询中:

  • createQueryBuilder("photo") 初始化一个针对 Photo 实体的查询。
  • leftJoinAndSelect("photo.metadata", "metadata")PhotoMetadata 实体联接到查询中,并选择别名为 metadata
  • leftJoinAndSelect("photo.user", "user")User 实体联接到查询中,并选择别名为 user
  • select([...]) 用来指定从这次查询中需要选择哪些字段。这里我们选择了照片的标题、元数据的描述和用户的名字。
  • getMany() 用于获取查询结果列表。

使用以上查询,你可以高效地从多个表中选择所需的字段,同时保持查询的清晰和管理的便捷。这种方式特别适合处理复杂的数据库关系和大量的数据。

2024年6月29日 12:07 回复

你的答案