nest-typeorm-mysql:一对多和多对一关系设计与增删改查

本文探讨了在NestJS与TypeORM框架下如何设计和操作一对多及多对一的关系。通过示例解释了如何定义实体关系,包括使用@OneToMany和@ManyToOne装饰器,并强调了在增删改查操作中使用事务的重要性。同时,指出了在实际操作中的一些设计挑战,例如更新操作的处理方式可能不符合直觉。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章问题导向

实体如何设计一对多与多对一关系,如何关联查询?

如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案


一对多关系,多对一关系

定义:一对多是一种一个 A 包含多个 B ,而多个B只属于一个 A 的关系
其实就是要设计两个表:一张是主表(一对多),一张是副表(多对一),查找主表时,关联查找副表
有外键的表称之为副表,不带外键的表称之为主表
如:一个用户拥有多个宠物,多个宠物只属于一个用户的(每个宠物只能有一个主人)
如:一个用户拥有多张照片,多张照片只属于一个用户的
如:一个角色拥有多个用户,多个用户只属于一个角色的(每个用户只能有一个角色)

一对多和多对一实体设计

一对多

使用@OneToMany() 来建立一对多关系
第一个参数:() => PhotoEntity, 和谁建立关系? 和PhotoEntity建立关系
第二个参数:(user) => user.photo,和哪个字段联立关系? user就是PhotoEntity的别名,可随便写,和PhotoEntity的userinfo字段建立关系
第三个参数:RelationOptions关系选项,待更新

import {
   
  Column,
  Entity,
  PrimaryGeneratedColumn,
  OneToOne,
} from 'typeorm';
import {
    AvatarEntity } from './avatar.entity';

@Entity({
    name: 'users' })
export class UsersEntity {
   
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;

  @OneToMany(() => PhotoEntity, (avatar) => avatar.userinfo)
  photos: PhotoEntity;
}

多对一

使用@ManyToOne() 来建立多对一关系,参数如同上

import {
    Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import {
    UsersEntity } from './user.entity';

@Entity({
    name: 'photo' })
export class PhotoEntity {
   
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    type: 'varchar' })
  url: string;

  @ManyToOne(() => UsersEntity, (user) => user.photos)
  @JoinColumn({
    name: 'userinfo_id' })
  userinfo: UsersEntity;
}

一对多和多对一增删改查

只要涉及两种表操作的,就需要开启事务:同时失败或同时成功,避免数据不统一
注意:所有数据应该是由前端传递过来的,这里为了方便,直接硬编码了(写死)
比较复杂的是更新操作

user.controller.ts

import {
   
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Query,
  Param,
  Delete,
  HttpCode,
  HttpStatus,
  ParseIntPipe,
} from '@nestjs/common';
import {
    Transaction, TransactionManager, EntityManager } from 'typeorm';  开启事务第一步:引入
import {
    UserService } from './user.service-oto';

@Controller('user'</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值