如何扩展 TypeORM QueryBuilder

问题描述 投票:0回答:1

我想向 typeorm 查询生成器添加自定义方法:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'

@Entity()
export class User {
  @PrimaryGeneratedColumn('uuid')
  id!: string

  @Column()
  name!: string
}

export const AppDataSource = new DataSource({
  ...config,
  entities: [User],
})

现在我想扩展 QueryBuilder 并向其添加一些自定义方法

import { SelectQueryBuilder } from 'typeorm'

class CustomUserQueryBuilder extends SelectQueryBuilder<User> {
  constructor() {
    super(AppDataSource.createQueryBuilder())
    this.from(User, 'user')
  }
  async customLeftJonAndSelect() {
    return this.where(`...`)
  }
}

const customQb = new CustomUserQueryBuilder()
customQb.select('*').customLeftJonAndSelect().getQuery()

问题是它一直给我这个错误:

EntityMetadataNotFoundError: No metadata for "User" was found: this.from(User, 'user')
                                                                        ^

我真的很感激如果有人可以帮助我如何实现这一点或任何关于我做错了什么的想法

node.js typescript typeorm node.js-typeorm
1个回答
0
投票

不确定到底是什么导致了你的问题,因为我也试图扩展

SelectQueryBuilder
并提出了一个与你的解决方案或多或少相同的解决方案。以下是我的实现。

export class MyQueryBuilder extends SelectQueryBuilder<MyEntity> {
  constructor(dataSource: DataSource) {
    super(
      dataSource
        .getRepository<MyEntity>()
        .createQueryBuilder('mine')
    );
  }

  async whereAlwaysTrue() {
    return this.where('1 = 1');
  }
}

我没有使用过

builder.from(...)
方法,也不是很熟悉它,但我想说,无论问题是什么,要么与该调用有关,要么与您的
AppDataSource
配置方式有关。

您记得运行迁移吗?通常,当我收到

No metadata ...
错误时,这是因为我忘记生成/运行迁移来为相关实体添加表。

© www.soinside.com 2019 - 2024. All rights reserved.