es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Paginación en TypeORM/NestJS

Tengo que introducir paginación en el método findAll(). Realmente no sé cómo hacerlo. Lo intenté pero está dando muchos errores. Usé el método findAndCount() proporcionado por typeorm para eso, pero no estoy seguro de cómo funcionará.

Por ahora, el siguiente método devuelve todos los registros. Necesito devolver 10 registros al mismo tiempo. Por favor, sugiera qué modificación debo hacer.

async findAll(queryCertificateDto: QueryCertificateDto,page=1):  Promise<PaginatedResult> {

    let { country, sponser } = queryCertificateDto;

    const query = this.certificateRepository.createQueryBuilder('certificate');

    if (sponser) {
        sponser = sponser.toUpperCase();
        query.andWhere('Upper(certificate.sponser)=:sponser', { sponser });
    }

    if (country) {
        country = country.toUpperCase();
        query.andWhere('Upper(certificate.country)=:country', { country });
    }      
    const  certificates = query.getMany();     
    return certificates;
}

Este es el archivo PaginatedResult.

export class PaginatedResult {
        data: any[];
        meta: {
          total: number;
          page: number;
          last_page: number;
        };
      }

Intenté cambiar el código de findAll() pero la cláusula where está dando error. No estoy seguro de cómo manejar query.getMany() en paginación.

const take = query.take || 10
        const skip = query.skip || 0


        const [result, total] = await this.certificateRepository.findAndCount(
            {
                where: query.getMany(),   //esto está dando error
                take:take,
                skip:skip
            }
        );
        return result;

Necesito introducir paginación en este método. Cualquier ayuda será realmente útil.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para introducir la paginación en el método findAll(), puedes modificar el código de la siguiente manera:

    async findAll(queryCertificateDto: QueryCertificateDto, page = 1, limit = 10): Promise<paginatedresult> {
      let { country, sponser } = queryCertificateDto;
      const query = this.certificateRepository.createQueryBuilder('certificate');
      if (sponser) {
        sponser = sponser.toUpperCase();
        query.andWhere('Upper(certificate.sponser) = :sponser', { sponser });
      }
      if (country) {
        country = country.toUpperCase();
        query.andWhere('Upper(certificate.country) = :country', { country });
      }
      const [certificates, total] = await query
        .take(limit)
        .skip((page - 1) * limit)
        .getManyAndCount();
      return {
        data: certificates,
        meta: {
          total,
          page,
          last_page: Math.ceil(total / limit),
        },
      };
    }
    

    En este código modificado:

    • Los parámetros page y limit se agregan para especificar la página actual y el número de elementos para devolver por página.
    • Los métodos take y skip se utilizan para aplicar la paginación según los parámetros page y limit. Estos métodos se aplican al objeto query antes de llamar a getManyAndCount() en lugar de a getMany().
    • El método getManyAndCount() se utiliza para obtener el conjunto de resultados paginado y el número total de elementos en el resultado de la consulta.
    • El resultado se devuelve como un objeto con dos propiedades: data, que contiene el conjunto de resultados paginado, y meta, que contiene los metadatos de paginación, incluido el número total de elementos, la página actual y la última página.

    Al utilizar este código, deberías poder paginar los resultados del método findAll().

Comments are closed.