文章问题导向
实体如何设计一对多与多对一关系,如何关联查询?
如果你都有了答案,可以忽略本文章,或去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'</