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