nodejs typeorm oneToMany&manyToOne详细用法

第一次做nodejs的项目,第一次使用typeorm,可以说使用过程不是踩坑,而是沿着坑底一路走来,目前遇到最深的坑可以说是typeorm的oneToMany和manyToOne,单表查询没问题,可是关联字段一直空,差点爬不上来,官方文档和各种博客查了两天时间(可能是我自己的问题),没找到一个系统的样例,总算自己试验成功,记录下一对多查询的整个过程,留给自己,也希望帮到新手朋友们。

一端:表名 -> 人:person,字段 -> {主键:person_id, 人名:person_name}

person表
多端:表名 -> 汽车: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方法,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字段中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值