Il y a 2 entités nommées Article
et Classification
. Et la relation d'eux est @ManyToMany
.
Voici ma question: Comment sauver la relation?
Mon code ci-dessous:
@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[];
}
Je peux enregistrer le Article
et Classification
_ réussite. Mais je ne sais pas comment sauver la relation d'eux.
J'ai essayé de sauvegarder la relation via le code ci-dessous:
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;
}
Et la puissance de données de données comme celle-ci
{
"name":"artile name",
"content":"article content",
"classification":[{
"id":4
},{
"id":3
}]
}
Au début, ça marche.
Mais lorsque je pose à nouveau les données, l'ancien enregistrement a été remplacé de manière plutôt créer un autre enregistrement.
Que devrais-je faire ensuite?
Il suffit d'examiner ci-dessous le code s'il vous plaît.
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;
}
Supposons que vous disposiez d'une gamme d'articles et vous souhaitez créer une relation avec une entité de classification. Vous venez d'affecter la matrice à la propriété articles
et enregistrez l'entité; Typeorm créera automatiquement la relation.
classification.articles = [article1, article2];
await this.classificationRepository.save(classification);
Pour que cela fonctionne, les entités d'article doivent déjà être sauvées. Si vous souhaitez que Typeorm enregistre automatiquement les entités de l'article, vous pouvez définir cascade
sur 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);
}