nodejs typeorm oneToMany&manyToOne详细用法_typeorm manytoone-程序员宅基地

技术标签: 关系  typeorm  nodejs  nodejs学习笔记  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字段中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sanbowla/article/details/94380251

智能推荐

Mac安装java反编译工具JD-GUI提示需要安装jdk1.8+解决方案_mac 安装 jd-jui 找不到 jdk-程序员宅基地

文章浏览阅读2.2k次。一、下载Java DecompilerJD Java Decompilerhttp://java-decompiler.github.io/二、 当打开JD-GUI软件时候,会弹出以下错误,见图示:而自己明明电脑上已经安装jdk 1.8了呀,为啥还会报这个错误呢,让人匪夷所思,最终才发现原来JD-GUI软件中相应的启动文件进行加载时候,会默认指定一个jdk目录去下边找,所以,找不到也就理所应当了。三、解决方案 1.右键选择包内容2.点击进去,然后选择该文件..._mac 安装 jd-jui 找不到 jdk

ffmpeg 常用基本命令和ffmpeg处理RTMP流媒体的常用命令_ffmpeg rtmp closed unsupported video codec: 15-程序员宅基地

文章浏览阅读983次。ffmpeg 常用基本命令1.分离视频音频流ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流2.视频解复用ffmpeg –i test.mp4 –vcodec co_ffmpeg rtmp closed unsupported video codec: 15

Golang基础6-反射-程序员宅基地

文章浏览阅读599次,点赞5次,收藏10次。Golang基础6-反射

JS中如何使用cookie_js使用cookie登录-程序员宅基地

文章浏览阅读7k次,点赞8次,收藏32次。最近在项目接触了很多在js中调用保存的cookie,是别人在项目的utils.js中保存了不少cookie。大多数保存的是当前登录的用户,和当前的系统,各种常用的id。1、cookie是什么:①、cookie 是存储于访问者计算机中的变量。每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript 来创建和读取 cookie。  ②、实际上 cookie 是存于用户硬盘..._js使用cookie登录

关于小程序隐私保护指引设置的公告_小程序隐私协议开发指南-程序员宅基地

文章浏览阅读2.8k次。为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。开发者首先需确定小程序是否涉及处理用户个人信息,如涉及,则需配置用户隐私授权弹窗,且仅有在平台《小程序用户隐私保护指引》中声明了所处理的用户个人信息,才可以调用平台提供的对应接口或组件。仅有在指引中声明所处理的用户个人信息,才可以调用平台提供的对应接口或组件。_小程序隐私协议开发指南

CefSharp内嵌chrome浏览器 支持mp4 h264编码_cefsharp x86 94.4.5 h.264支持-程序员宅基地

文章浏览阅读9.2k次。https://download.csdn.net/download/qq_20757489/10868821CefSharp 63版本(X86)编译好的文件支持mp3 mp41.创建winform程序,使用.NET 4.5.2或以上。2.在解决方案上右键->"属性"->"生成"->"目标平台",选择x86,Cef暂不支持"Any CPU"。3.将下载下来的文件解..._cefsharp x86 94.4.5 h.264支持

随便推点

vivado仿真器文件没有针对VCS的,这个时候将ip文件夹下的sim 和simulation文件夹给到VCS就可以_vivado不支持vcs-程序员宅基地

文章浏览阅读1k次。这个时候将ip文件夹下的sim 和simulation文件夹给到VCS就可以_vivado不支持vcs

【python】多维list(非对齐数据)填充,可视化,colorbar操作_多维list展平-程序员宅基地

文章浏览阅读723次。读取非对齐数据到list,数据填充。可视化,colrbar_多维list展平

Python机器学习零基础理解随机森林算法_随机森林零基础-程序员宅基地

文章浏览阅读3.6w次。大家好,我是Mr数据杨。今天,我想让大家跟我一起回到历史的烟云之中,探索“随机森林”的奥秘,其实,这与三国演义中的一段经历颇有相似之处。记得那时曹操曾经在建邺遇到了大问题,他需要找出敌人刘备的真正意图。这就如同在大数据中找寻答案,需要用随机森林这一工具理解并预测未来。这如同曹操手下的谋士郭嘉,用他的聪明才智,协助曹操一步步揭示真相。_随机森林零基础

基于单片机带计分功能的8路抢答器设计-程序员宅基地

文章浏览阅读627次,点赞18次,收藏17次。*单片机设计介绍,基于单片机带计分功能的8路抢答器设计。

Bootstrap-Grip_bootstrap grip-程序员宅基地

文章浏览阅读139次。[Menu]AboutGripCodePageSummaryTableCodePageSummarySourceAbout最近开始学习 Bootstrap 将自己的学习进程记录 本文记录关于 Grip 和 Table 这两块GripCode:

一分钟学会清理垃圾运行命令-程序员宅基地

文章浏览阅读8.8k次,点赞4次,收藏31次。很多人在问清理垃圾运行命令是什么,接下来小编给大家带来清理垃圾的办法,保证让大家一分钟学会清理垃圾运行命令,从此电脑维护变得轻轻松松。  第一招:清理垃圾  在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:*.tmp、*._mp)日志文件(*.log)、临时帮助文件(*.gid)、磁盘检查文件(*.chk)、临时备份文件(如:*.old、*.bak)以及其他临...

推荐文章

热门文章

相关标签