文章问题导向
实体如何设计多对多关系?如何增删改查?
如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案
多对多关系
定义:多对多是一种 A 包含多个 B,而 B 包含多个 A 的关系
如:一个粉丝可以关注多个主播,一个主播可以有多个粉丝
如:一篇文章属于多个分类,一个分类下有多篇文章
比如这篇文章,可以放在nest目录,也可以放在typeorm目录或者mysql目录
实现方式
第一种:建立两张表,使用装饰器@ManyToMany建立关系,typeorm会自动生成三张表
第二种:手动建立3张表
这里使用第一种
实体设计
这里将设计一个用户(粉丝) 与 明星的 多对多关系
用户(粉丝)可以主动关注明星,让users变为主表,加入@JoinTable()
使用@ManyToMany() 来建立多对多关系
第一个参数:() => StarEntity, 和谁建立关系? 和StarEntity建立关系
第二个参数:(star) => star.photo,和哪个字段联立关系? star就是StarEntity的别名,可随便写,和PhotoEntity的followers字段建立关系
用户(粉丝)表:follows关注/跟随
import {
Column,
Entity,
PrimaryGeneratedColumn,
ManyToMany,
JoinTable,
} from 'typeorm';
import {
AvatarEntity } from './avatar.entity';
@Entity({
name: 'users' })
export class UsersEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
@ManyToMany(() => StarEntity, (star) => star.followers)
@JoinTable()
follows: StarEntity[]; 注意这里是数组类型
}
明星表:followers跟随者
import {
Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';
import {
UsersEntity } from './user.entity';
@Entity({
name: 'star' })
export class StarEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({
type: 'varchar' })
name: string;
@ManyToMany(() => UsersEntity, (user) => user.follows)
followers: UsersEntity;
}
注意:
程序运行后,将会默认在数据库中生成三张表,users,star,users_follows_star,users_follows_star是中间表,用于记录users和star之间的多对多关系,它是自动生成的。
为了测试方便,你可以在users表和star表创建一些数据:这些属于单表操作
自动生成的users_follows_star表
+---------+--------+
| usersId | starId |
+---------+--------+
| | |
+---------+--------+
users表手动插入数据
+----+----------+------