前一篇讲述了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很类似。实际使用中会有更多的高级需求,如多表联合,主从等。