import { FindManyOptions, FindOptionsWhere, Repository, SelectQueryBuilder, } from 'typeorm'; import { PaginationParams } from '../interface'; import { plainToInstance } from 'class-transformer'; export class PaginationResult { current: number; pageSize: number; total: number; items: T[]; } export async function paginate( repository: Repository | SelectQueryBuilder, options: { pagination: PaginationParams; where?: FindOptionsWhere | FindOptionsWhere[]; relations?: string[]; order?: Record; transformerClass?: new () => T; // 可选:用于指定需要转换的类 } ): Promise> { const { pagination: { current, pageSize }, relations = [], where = {}, order = {}, transformerClass, } = options; if (repository instanceof SelectQueryBuilder) { let queryBuilder = repository; const total = await queryBuilder.getCount(); queryBuilder = queryBuilder.skip((current - 1) * pageSize).take(pageSize); const items = await queryBuilder.getRawMany(); const transformedItems = transformerClass ? plainToInstance(transformerClass, items) : items; return { items: transformedItems, total, current, pageSize, }; } const items = await repository.find({ where, skip: (current - 1) * pageSize, take: pageSize, relations, order, } as FindManyOptions); const total = await repository.count({ where, take: pageSize, relations, order, } as FindManyOptions); const transformedItems = transformerClass ? plainToInstance(transformerClass, items) : items; return { items: transformedItems, total, current, pageSize, }; }