Nest通过TypeORM操作MySQL (二)

前一篇讲述了TypeORM的安装以及通过对象化的方式访问数据库。 然而很多场景下我们会需要更复杂的操作,如多表联合,然后映射为Entity。 本文在前一篇的基础上,用代码示例说明如何在TypeORM中实现SQL查询。

修改ormconfig.json, 增加新的配置项: Menu。与前一篇配置不同的是,此处有两个connection配置,默认使用的是default。
参考手册

[
  {
    "name": "default",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "Password01!",
    "database": "dmp",
    "entities": ["dist/**/*.entity.js"],
    "synchronize": true
  },
  {
    "name": "Menu",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "Password01!",
    "database": "dmp",
    "entities": ["dist/**/*.entity.js"]
  }
]

创建对象实体,这里由于是SQL查询映射而来,不是由数据库表映射,所以不需要在@Entity()上加表命参数

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

  @Column({ length: 45 })
  firstname: string;

  @Column({ length: 45 })
  familyname: string;

  @Column({ length: 200 })
  email: string;
}

service层,注意此处的createConnection的参数,对应了ormconfig.json中的name参数

import { Repository, createConnection } from 'typeorm';

async getMenu(id: number): Promise<Menu> {
    const connection = await createConnection('Menu');

    const userMenus = await connection
      .createQueryBuilder()
      .select('menu')
      .from(Menu, 'menu')
      .where('menu.id=:id', { id: id })
      .getOne();

    return userMenus;
}

Controller增加访问方法

@Get('/user/:id')
getMenu(@Param() params) {
  return this.service.getUserMenu(params.id);
}

至此,我们只是粗略了解了typeorm的基础使用方式,感觉同.net平台的entity framework很类似。实际使用中会有更多的高级需求,如多表联合,主从等。

上一篇:.NetCore中Elasticsearch组件NEST的使用


下一篇:Nest操作MySQL