とにかく、クエリを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'}]}
この 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 にあります。
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 })
}
}
多くのレコードをページ分割する必要がある場合、つまり、いくつかの反復(移行中または一括更新中)。
async getPaginatedResults(query: any, transactionManager?: EntityManager): Promise<any> {
}