web-dev-qa-db-fra.com

Comment économiser de la relation dans @manytomany à Typeorm

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.

enter image description here

Mais lorsque je pose à nouveau les données, l'ancien enregistrement a été remplacé de manière plutôt créer un autre enregistrement.

enter image description here

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;
  }
8
Eve-Sama

Comment économiser des relations?

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

Votre exemple

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);
}
4
Kim Kern