导言
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)
}
}
}