如何在typeORM中的@ManyToMany中保存关系 [英] How to save relation in @ManyToMany in typeORM
问题描述
有两个名为 Article
和 Classification
的实体.它们之间的关系是 @ManyToMany
.
There are 2 entities named Article
and Classification
. And the relation of them is @ManyToMany
.
这是我的问题:如何保存关系?
Here's my question: How to save the relation?
我的代码如下:
@Entity()
export class Article {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@CreateDateColumn()
createTime: Date;
@UpdateDateColumn()
updateTime: Date;
@Column({
type: 'text',
})
content: string;
@Column({
default: 0,
})
likeAmount: number;
@Column({
default: 0,
})
commentAmount: number;
}
@Entity()
export class Classification {
@PrimaryGeneratedColumn()
id: number;
@CreateDateColumn()
createTime: Date;
@UpdateDateColumn()
updateTime: Date;
@Column()
name: string;
@ManyToMany(type => Article)
@JoinTable()
articles: Article[];
}
我可以成功保存 Article
和 Classification
.但是我不确定如何保存它们之间的关系.
I can save the Article
and Classification
successful. But I'm not sure how to save the relation of them.
我试图通过以下代码保存关系:
I have tried to save the relation via below code:
async create(dto: ArticleClassificationDto): Promise<any> {
const article = this.repository.save(dto);
article.then(value => {
console.log(value);//console the object article
value.classification.forEach(item => {
const classification = new Classification();
classification.id = item.id;
classification.articles = [];
classification.articles.push(value);
this.classificationService.save(classification);
})
});
console.log(article);
return null;
}
这样的发布数据结构
{
"name":"artile name",
"content":"article content",
"classification":[{
"id":4
},{
"id":3
}]
}
一开始就有效.
但是当我再次发布数据时,旧记录被替换了,而是创建了另一条记录.
But when I post the data again, the old record was replaced rather create another record.
接下来我该怎么办?
请看下面的代码.
async create(dto: ArticleClassificationDto): Promise<any> {
this.repository.save(dto).then(article => {
article.classification.forEach(item => {
this.ClassificationRepository.findOne(
{
// the privous method is get all the articles from databse and push into this array
// relations: ['articles'],
where: { id: item }// now I change the data strcture, just contains id instead of {id}
}
).then(classification => {
// console.log(article);
console.log(classification);
// cmd will show ' UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of undefined' withous below line code. But if I init the array manually,the old record will be replaced again.
// classification.articles = [];
classification.articles.push(article);
this.ClassificationRepository.save(classification);
});
})
})
return null;
}
推荐答案
如何保存关系?
让我们假设您有一系列文章,并且想要创建与分类实体的关系.您只需将数组分配给属性 articles
并保存实体.typeorm将自动创建关系.
How to save relations?
Let's assume you have an array of articles and you want to create a relation to a classification entity. You just assign the array to the property articles
and save the entity; typeorm will automatically create the relation.
classification.articles = [article1, article2];
await this.classificationRepository.save(classification);
要执行此操作,必须已保存商品实体.如果希望typeorm自动保存文章实体,则可以设置 cascade
转换为 true
.
For this to work, the article entities have to be saved already. If you want typeorm to automatically save the article entities, you can set cascade
to true
.
@ManyToMany(type => Article, article => article.classifications, { cascade: true })
您的示例
async create(dto: ArticleClassificationDto): Promise<any> {
let article = await this.repository.create(dto);
article = await this.repository.save(article);
const classifications = await this.classificationRepository.findByIds(article.classification, {relations: ['articles']});
for (const classification of classifications) {
classification.articles.push(article);
}
return this.classificationRepository.save(classifications);
}
这篇关于如何在typeORM中的@ManyToMany中保存关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!