如何在typeORM中的@ManyToMany中保存关系

时间:2019-02-26 12:47:50

标签: javascript node.js orm nestjs typeorm

有两个名为SteveArticle的实体。它们之间的关系是Classification

这是我的问题:如何保存关系?

我的代码如下:

@ManyToMany

我可以成功保存 @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

这样的发布数据结构

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

一开始就有效。

enter image description here

但是当我再次发布数据时,旧记录被替换而创建了另一个记录。

enter image description here

下一步我该怎么做?

请看下面的代码。

    {
        "name":"artile name",
        "content":"article content",
        "classification":[{
            "id":4
        },{
            "id":3
        }]
    }

2 个答案:

答案 0 :(得分:2)

如何保存关系?

让我们假设您有一系列文章,并且想要创建与分类实体的关系。您只需将数组分配给属性articles并保存实体; typeorm将自动创建关系。

classification.articles = [article1, article2];
await this.classificationRepository.save(classification);

要执行此操作,必须已保存商品实体。如果希望typeorm自动保存文章实体,可以将cascade设置为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);
}

答案 1 :(得分:0)

在我的情况下,我有用户和角色,首先你必须在你的实体中初始化你的 manytomany :

在用户实体中:

@ManyToMany((type) => Role, {
    cascade: true,
  })
  @JoinTable({
    name: "users_roles",
    joinColumn: { name: "userId", referencedColumnName: "id" },
    inverseJoinColumn: { name: "roleId" }
  })
  roles: Role[];

在角色实体中:

  //Many-to-many relation with user
  @ManyToMany((type) => User, (user) => user.roles)
  users: User[];

在我的服务中,我从我的数据中创建了一个新实体,然后我将角色数据添加到了我的新实体对象中:

let entity = await this.userRepository.create(data);
let entity2 = {
        ...entity,
        roles: data.selectedRoles,
      };
const user = await this.userRepository.save(entity2);

这是typeorm网站中的示例:

const category1 = new Category();
category1.name = "animals";
await connection.manager.save(category1);

const category2 = new Category();
category2.name = "zoo";
await connection.manager.save(category2);

const question = new Question();
question.title = "dogs";
question.text = "who let the dogs out?";
question.categories = [category1, category2];
await connection.manager.save(question);