TypeORM多对多关系如何进行数据更新

TypeORM多对多关系如何进行数据更新

_

导言

TypeORM的多对多关系,不能使update方式进行更新,只能使save方式去进行关系维护。若执update方法,会提示xxx_id字段未传递。在官网上也未找到对应的解决方案github上也找了好久,依旧无果。最终使用save方法(与后台开发人员沟通了老久后找到的一个投机取巧的方式)效果是嘎嘎的。亲测有效。

前置说明

文章(article)标签(tag)进行列举。一个文章可能包含多个标签,一个标签下可能有多个文章。此处关系双向多对多关系

  • 文章实体类(Article)

import {

  Entity,

  Column,

  OneToOne,

  JoinTable,

  JoinColumn,

  ManyToMany,

  CreateDateColumn,

  UpdateDateColumn,

  PrimaryGeneratedColumn,

} from "typeorm"

import {ArticleType} from "./articleType";

import {Tag} from "./tag";

@Entity()

export class Article {

  // 文章ID

  @PrimaryGeneratedColumn("uuid")

  id: string;

  // 文章标题

  @Column({default: ""})

  title: string;

  // 文件简介

  @Column({default: ""})

  description: string;

  // 缩略图链接地址

  @Column({default: ""})

  thumbUrl: string;

  // 关键词

  @Column({default: ""})

  keywords: string;

  // 分类信息

  @OneToOne(() => ArticleType)

  @JoinColumn()

  typeInfo: ArticleType;

  // 标签信息

  @ManyToMany(() => Tag, tag => tag.articleList)

  @JoinTable({

    name: 'article_tag',

    joinColumns: [

      {name: 'article_id'}

    ],

    inverseJoinColumns: [

      {name: 'tag_id'}

    ]

  })

  tagList: Tag[];

  // 文章内容

  @Column("text")

  content: string;

  // 查阅次数

  @Column({default: 0})

  readNum: number;

  // 创建时间

  @CreateDateColumn()

  createTime: string;

  // 最后更新时间

  @UpdateDateColumn()

  updateTime: string;

}
  • 标签实体类(Tag)

import {

  Column,

  ManyToMany,

  CreateDateColumn,

  UpdateDateColumn,

  PrimaryGeneratedColumn, Entity,

} from "typeorm";

import {Article} from "./article";

@Entity()

export class Tag {

  // ID

  @PrimaryGeneratedColumn("uuid")

  id: string;

  // 名称

  @Column({default: ""})

  name: string;

  // 标签对应的文章列表

  @ManyToMany(() => Article, article => article.tagList)

  articleList: Article[]

  // 创建时间

  @CreateDateColumn()

  createTime: string;

  // 更新时间

  @UpdateDateColumn()

  updateTime: string;

}

  • 关系更新具体代码

import {Request} from "express";

import {getRepository} from "typeorm";

import utils from "../utils";

export class ArticleCtrl {

  private articleRep = getRepository("Article")

  private typeRep = getRepository("ArticleType")

  private tagRep = getRepository("Tag")

  /**

   * @description: 更新文章信息

   */

  async updateArticleInfo(req: Request) {

    try {

      const tagList = await this.tagRep.findByIds(JSON.parse(req.tagList))

      const typeInfo = await this.typeRep.findOne({id: req.typeId})

      await this.articleRep.save({

        id: req.id,

        title: req.title,

        thumbUrl: req.thumbUrl,

        keywords: req.keywords,

        content: req.content,

        description: req.description,

        typeInfo: typeInfo,

        tagList: tagList

      })

      return utils.changeResult(null, true, "更新成功")

    } catch {

      return utils.errorCatch("更新文章信息失败", req)

    }

  }

}

如何使用TypeORM开发一个博客管理后台 2024-11-01
网页实现滚动加载数据 - Vue/JavaScript 2024-12-07

评论区

© 2026 Louis前端大杂烩