You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest.js+TypeORM使用nestjs-typeorm-paginate实现按item_id过滤分页

修改方案

直接按以下步骤调整代码即可实现按item_id过滤后分页:

1. 调整控制器代码

把路由拿到的item_id传递给service方法,同时修正分页路由的动态参数:

import { QuestionsService } from 'src/questions/services/questions.service';
import { Questions } from '../models/questions.interface';
import { DeleteResult } from 'typeorm';
import { Response } from 'express';
import { IPaginationMeta, Pagination } from 'nestjs-typeorm-paginate';
import { QuestionsEntity } from '../models/questions.entity';

@Controller('questions')
export class QuestionsController {

    constructor(private questionsService: QuestionsService) { }
    
    @Get(':item_id')
    async findAll(
        @Param('item_id') item_id: number,
        @Res() res: Response,
        @Query('page', new DefaultValuePipe(1), ParseIntPipe) page = 1,
        @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit = 10,
    ): Promise<Pagination<QuestionsEntity, IPaginationMeta> | void> {
        limit = limit > 100 ? 100 : limit;
        // 传递item_id到service,同时替换路由中的动态参数
        const paginatedQuestions = await this.questionsService.paginate(
          {
              page,
              limit,
              route: `questions/${item_id}`
          },
          item_id
        );
        if (paginatedQuestions)
            return res.status(200).send(paginatedQuestions).end()
        return res.status(404).end('Error! Questions Not Found')
    }
}

2. 调整Service代码

新增接收过滤参数的入参,在分页查询时添加where条件即可,nestjs-typeorm-paginate的paginate方法原生支持第三个参数传入TypeORM的查询配置:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { DeleteResult, Repository, FindManyOptions } from 'typeorm';
import { QuestionsEntity } from '../models/questions.entity';
import { Questions } from '../models/questions.interface';
import { paginate, Pagination, IPaginationOptions } from 'nestjs-typeorm-paginate';

@Injectable()
export class QuestionsService {
    constructor(
        @InjectRepository(QuestionsEntity)
        private readonly questionsRepository: Repository<QuestionsEntity>
    ) { }

    // 新增itemId入参,接收过滤条件
    async paginate(options: IPaginationOptions, itemId: number): Promise<Pagination<QuestionsEntity>> {        
        // 传入where条件过滤item_id
        return paginate<QuestionsEntity>(this.questionsRepository, options, {
          where: {
            item_id: itemId
          }
        });
    } 
}

如果后续需要更多过滤条件,也可以把service的第二个入参改成对象类型,把所有过滤字段都放进去,扩展起来更灵活。

内容的提问来源于stack exchange,提问作者Pablo Canale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:03