首页 > 解决方案 > Typescipt:如何从 typeorm getManager.query() 访问类内容

问题描述

我对 typeORM/Typescript 世界比较陌生。我有一个服务类来提供资源,如下所示:

import { Injectable} from '@nestjs/common';
import { getManager } from 'typeorm';

class MyServiceClass {

//static readonly sqlStr = `SELECT MAINTABLE.* WITH LEFT OUTER JOIN WITH TWO MORE TABLES `;

async findAll(limit?: number) {
    const mgr = getManager();
    const retRows = await mgr.query(
      `
      SELECT MAINTABLE.* WITH LEFT OUTER JOIN WITH TWO MORE TABLES

          ${limit ? `FETCH NEXT ${limit} ROWS ONLY` : ''}
      `,
    );
    return retRows;
  }

async findOne(id: number) {
    const mgr = getManager();
    const retRow = await mgr.query(
      `
      SELECT MAINTABLE.* WITH LEFT OUTER JOIN WITH TWO MORE TABLES

        ${id ? ` WHERE MAINTABLE.MAIN_ID = ${id}` : ''}
      `,
    );
    return retRow;
  }

}

我想从每个函数中删除 sql 语句,但保留过滤逻辑。相反,我想在 mgr.query() 函数中使用 MyServiceClass.sqlStr 。如果有人指出我如何做到这一点,那就太好了。

标签: typescriptnestjstypeorm

解决方案


您应该使用 typeorm 模块中的存储库工具:

async findAll(limit?: number) {
    const entities = await this.entityRepository.findAll(
      { where: { id: 1 } }, relations: ['someRelation'], sort: {id: 'DESC'},
      /* you can create very advanced requests */
    );

    return entities;
  }

或使用查询生成器:

async findAll(limit?: number) {
    const rows = await this.entityRepository
       .createQueryBuilder('Entity')
       .leftJoinAndSelect('Entity.relation', 'relation')
       .where('relation.id = :id', {id: 1})
       /* any query condition here */
       .getMany() // or .getSql() or whatever you want

    return rows;
  }

有关如何在此处设置 typeorm 存储库的更多详细信息

有关在此处查找选项的更多信息

在此处查询构建器文档


推荐阅读