NestJs 下使用 TypeORM 分页查询问题

开发应用程序时,大部分时间都需要分页功能。如果您的应用程序中有分页、页面滑块或无限滚动组件,则使用此选项。

官方教程

DEMO

1
2
3
4
5
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.take(10)
.getManyAndCount();

这将会查询前10条用户及其照片的数据。

1
2
3
4
5
6
// getManyAndCount 返回一个长度为2的元组,[0] 是分页后的数据数组, [1] 是所有数据总数
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(10)
.getManyAndCount();

这将会查询除了前10条用户以外的所有人及其照片的数据。

您可以组合使用他们:

1
2
3
4
5
6
const users = await getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.skip(5)
.take(10)
.getManyAndCount();

这将会在第6条记录开始查询10条记录,即查询6-16条用户及其照片的数据。

注意:**takeskip 可能看起来像 limitoffset,但它们不是。一旦您有更复杂的连接或子查询查询,limitoffset 可能无法正常工作。使用 takeskip 可以防止出现这些问题。**

skip + take 与 offset + limit 的区别

当查询中存在连接或子查询时,skip + take 的方式总是能正确的返回数据,而 offset + limit 返回的数据并不是我们期望的那样。所以查询分页数据时,应该使用 skip + take