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

TypeORM 如何执行子查询

6 个月前提问
5 个月前修改
浏览次数35

1个答案

1

在 TypeORM 中,执行子查询是一种非常有用的功能,可以帮助我们构建复杂的查询,以从数据库中有效地检索数据。TypeORM 提供了多种方法来执行子查询,包括使用 QueryBuilder 和 Repository API。下面我将通过一个具体的例子来展示如何使用 QueryBuilder 来执行子查询。

假设我们有一个名为 User 的实体,其中包含用户的信息,以及一个名为 Photo 的实体,其中包含关于用户照片的信息。每个用户可以有多张照片。现在,我们想要查询每个用户最新的一张照片。

首先,我们需要设置实体关系。这里不赘述实体的创建和关系的映射过程,我们直接看如何构建查询。

使用 TypeORM 的 QueryBuilder,我们可以这样写查询:

typescript
import { getRepository, createQueryBuilder, Brackets } from "typeorm"; import { User } from "./entity/User"; import { Photo } from "./entity/Photo"; async function findLatestPhotoForEveryUser() { const usersWithLatestPhoto = await getRepository(User) .createQueryBuilder("user") .leftJoinAndSelect(subQuery => { return subQuery .select("photo.userId", "userId") .addSelect("MAX(photo.id)", "maxPhotoId") .from(Photo, "photo") .groupBy("photo.userId"); }, "latestPhoto", "latestPhoto.userId = user.id") .leftJoinAndSelect("photo", "photo", "photo.id = latestPhoto.maxPhotoId") .getMany(); return usersWithLatestPhoto; }

这里的查询分两部分:

  1. 创建子查询:我们首先创建了一个子查询来找出每个用户的最新照片的 ID。这通过对 Photo 表进行分组并选择最大的 id 值来实现。

  2. 联结子查询和主查询:然后通过 leftJoinAndSelect 将子查询的结果联结到主查询上。这里我们关联 UserPhoto 表,确保每个用户与其最新的照片相联结。

最终,我们通过 getMany() 方法获取所有用户及其最新照片的列表。

这个例子展示了如何利用 TypeORM 的强大功能来执行复杂的子查询,从而有效地处理数据库中的数据。

2024年6月29日 12:07 回复

你的答案