nodejs typeorm oneToMany&manyToOne详细用法
作者:互联网
第一次做nodejs的项目,第一次使用typeorm,可以说使用过程不是踩坑,而是沿着坑底一路走来,目前遇到最深的坑可以说是typeorm的oneToMany和manyToOne,单表查询没问题,可是关联字段一直空,差点爬不上来,官方文档和各种博客查了两天时间(可能是我自己的问题),没找到一个系统的样例,总算自己试验成功,记录下一对多查询的整个过程,留给自己,也希望帮到新手朋友们。
一端:表名 -> 人:person,字段 -> {主键:person_id, 人名:person_name}
多端:表名 -> 汽车:car,字段 -> {主键:car_id, 车牌:car_brand,所属人id:person_id}
Person.ts实体(person表)
import { Entity, Column, BaseEntity, PrimaryColumn, OneToMany } from 'typeorm';
import { Car } from './Car';
//原型@Entity({name: 'person'}), 为数据库中表的实际名称, 可以简写如下
@Entity('person')
export class Person extends BaseEntity {
//每个数据库实体中必须包含一个PrimaryColumn
//注意:此处不可以简写为PrimaryColumn('person_id')
@PrimaryColumn({name: 'person_id'})
personId: number;
//定义属性为字段,对应person_name
@Column({name: 'person_name'})
personName: string;
//定义表关系, @OneToMany不可以单独出现,对应的Car实体中必须存在对应的@ManyToOne修饰的属性person
@OneToMany(type => Car, car => car.person)
cars: Car[];
//按照id查找人员和所属车辆
static findByPersonId(personId: number) {
return this.createQueryBuilder('Person')
//注意不要用leftJoin方法,本方法会将关联表Car的连接查询结果保存到Person.cars中
.leftJoinAndSelect('Person.cars', 'Car')
.where('Person.personId=:personId', { personId })
.getMany();
}
}
Car.ts实体(car表)
import { Entity, Column, BaseEntity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';
import { Person } from './Person';
@Entity('car')
export class Car extends BaseEntity {
@PrimaryColumn({ name: 'car_id' })
carId: number;
@Column({name: 'person_id'})
personId: number;
@Column({ name: 'car_brand' })
carBrand: string;
//对应Person实体中的@OneToMany修饰的字段(不可以单独存在)
@ManyToOne(type => Person, person => person.cars)
//指定本表中的外键(JoinColumn只存在于多端,因为外键只会存在于多端)
@JoinColumn({name: 'person_id'})
person: Person;
}
配置好路由,路由配置不在本文探讨范围之内。
访问http://127.0.0.1:3000/person/1
可以得到 张三和张三的车 兰博基尼和宾利。
对应typeorm生成的sql语句如下。
SELECT “Person”.“person_id” AS “Person_person_id”, “Person”.“person_name” AS “Person_person_name”, “Car”.“car_id” AS “Car_car_id”, “Car”.“person_id” AS “Car_person_id”, “Car”.“car_brand” AS “Car_car_brand” FROM “person” “Person” LEFT JOIN “car” “Car” ON “Car”.“person_id”=“Person”.“person_id” WHERE “Person”.“person_id”=@0 – PARAMETERS: [“1”]
注意:.leftJoinAndSelect(‘Person.cars’, ‘Car’)如果写成leftJoin也可以生成一样的sql语句,但是并不会把连接查询的结果保存到Person的cars字段中。
标签:name,nodejs,Car,oneToMany,Person,person,manyToOne,id,car 来源: https://blog.csdn.net/sanbowla/article/details/94380251