web-dev-qa-db-fra.com

Comment implémenter la pagination dans nestjs avec typeorm

Quoi qu'il en soit, pour obtenir le nombre total et enregistrer avec une seule requête, au lieu d'exécuter la requête deux fois. Ou comment puis-je réutiliser la condition where dans les deux requêtes.

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

Vous pouvez trouver un bel exemple dans ce projet . En bref, typeorm a une méthode vraiment sympa spécifique à ce cas d'utilisation 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 de référentiel que vous pouvez trouver ici . Plus de documentation sur la classe Repository peut être trouvée ici .

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

Si vous avez besoin de paginer dans DE NOMBREUX enregistrements, c'est-à-dire plusieurs itérations (peut-être lors d'une migration ou d'une mise à jour en masse).

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

}
0
sloan-dog