web-dev-qa-db-ja.com

typeormでnestjsにページネーションを実装する方法

とにかく、クエリを2回実行する代わりに、1つのクエリで合計カウントとレコードを取得します。または、両方のクエリでwhere条件をどのように再利用できますか?.

async findAll(query): Promise<Paginate> {
    const take = query.take || 10
    const skip = query.skip || 0
    const keyword = query.keyword || ''

    const builder = this.userRepository.createQueryBuilder("user")
    const total = await builder.where("user.name like :name", { name: '%' + keyword + '%' }).getCount()
    const data = await builder.where("user.name like :name", { name: '%' + keyword + '%' }).orderBy('name', 'DESC').skip(skip).take(take).getMany();

    return {
        data: data,
        count: total
    }
}

{count:10、data:[{id:1、name: 'David'}、{id:2、name: 'Alex'}]}

6
Han

この project でニースの例を見つけることができます。要するにtypeormには、このユースケースfindAndCountに特有の本当に素晴らしいメソッドがあります。

async findAll(query): Promise<Paginate> {
    const take = query.take || 10
    const skip = query.skip || 0
    const keyword = query.keyword || ''

    const [result, total] = await this.userRepository.findAndCount(
        {
            where: { name: Like('%' + keyword + '%') }, order: { name: "DESC" },
            take: take,
            skip: skip
        }
    );

    return {
        data: result,
        count: total
    }
}

見つけることができるリポジトリAPI こちらRepositoryクラスに関する詳細なドキュメントは here にあります。

16
Ivan Vasiljevic
import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class PagerMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    req.query.take = Number(req.query.take) || 10
    req.query.skip = Number(req.query.skip) || 0
    next();
  }
}

# ... and apply in module.

export class AdminFeatureApi implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(PagerMiddleware)
    .forRoutes({ path: 'product/paged', method: RequestMethod.GET })
  }
}
1
Gui Seek

多くのレコードをページ分割する必要がある場合、つまり、いくつかの反復(移行中または一括更新中)。

async getPaginatedResults(query: any, transactionManager?: EntityManager): Promise<any> {

}
0
sloan-dog