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

文章问题导向

实体如何设计多对多关系?如何增删改查?

如果你都有了答案,可以忽略本文章,或去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表手动插入数据
+----+----------+------
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值