【问题标题】:Pagination without id column in TypeORMTypeORM中没有id列的分页
【发布时间】:2022-09-27 13:15:55
【问题描述】:

有没有什么方法可以只选择没有 id 列的给定列并在 TypeORM 中使用分页(跳过、获取)。我在 NestJS 中这样做:

文章.service.ts:

async getAll(skip: number): Promise<Article[]> {
  return await this.articleRepository.find({
    select: {
      id: false,
      title: true,
      description: true,
      body: false,
      created_at: true,
      updated_at: false,
      author: {
        full_name: true
      }
    },
    relations: {
      author: true
    },
    skip: skip,
    take: 10,
    order: {
      created_at: \'DESC\'
    }
  });
}

而在文章.controller.ts

@Get(\'articles\')
async getAll(@Query(\'page\') page: number) {
  if(!page) { page = 1; }
  const skip = (page - 1) * 10;

  const articles = await this.articlesService.getAll(skip);
  return {
    status: true,
    articles: articles,
    page: page,
  }
}

我的文章实体.ts

@Entity()
export class Article {
  
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 100 })
  title: string;

  @Column()
  description: string

  @Column({ type: \'text\' })
  body: string;

  @ManyToOne(() => User, (user) => user.articles)
  author: User;

  @CreateDateColumn()
  created_at: string;

  @UpdateDateColumn()
  updated_at: string;
}

当我向此端点发送请求时,会发生错误。我认为这是因为分页(跳过,采取)。

QueryFailedError: column distinctAlias.Article_id does not exist
    at PostgresQueryRunner.query (project/src/driver/postgres/PostgresQueryRunner.ts:299:19)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at SelectQueryBuilder.loadRawResults (project/src/query-builder/SelectQueryBuilder.ts:3601:25)
    at SelectQueryBuilder.getRawMany (project/src/query-builder/SelectQueryBuilder.ts:1573:29)
    at SelectQueryBuilder.executeEntitiesAndRawResults (project/src/query-builder/SelectQueryBuilder.ts:3295:26)
    at SelectQueryBuilder.getRawAndEntities (project/src/query-builder/SelectQueryBuilder.ts:1617:29)
    at SelectQueryBuilder.getMany (project/src/query-builder/SelectQueryBuilder.ts:1707:25)
    at ArticlesService.getAll (project/src/articles/articles.service.ts:35:12)
    at ArticlesController.getAll (project/src/articles/articles.controller.ts:56:22)
    at project/node_modules/@nestjs/core/router/router-execution-context.js:46:28

但是,如果我删除跳过并选择或选择它的 id 列。有什么方法可以选择没有 id 列的其他列并一起使用分页

  • 在您的表中不存在列column distinctAlias.Article_id does not exist。检查你的 sql 查询

标签: javascript typescript nestjs typeorm


【解决方案1】:

通过选择 id 列并在返回之前删除它们暂时解决了问题

articles.forEach(article => { delete article.id });

这是来自的完整功能文章.service.ts

async getAll(skip: number): Promise<Article[]> {
  const articles = await this.articleRepository.find({
    select: {
      id: true,
      title: true,
      description: true,
      body: false,
      created_at: true,
      updated_at: false,
      author: {
        full_name: true
      }
    },
    relations: {
      author: true
    },
    skip: skip,
    take: 10,
    order: {
      created_at: 'DESC'
    }
  });
  articles.forEach(article => { delete article.id });
  return articles;
}

笔记:不过应该有更好的解决方案。

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2020-06-04
    相关资源
    最近更新 更多