在typeorm中保存并使用自引用实体

时间:2020-06-10 23:47:58

标签: typescript nestjs typeorm

在解释我当前面临的问题时,我会尽量保持清楚。

CategoryEntity类中的一段代码。

category.entity.ts

    @ManyToMany(type => EntryEntity, entry => entry.categories)
    entries: EntryEntity[];

    @ManyToOne(type => UserEntity, user => user.categories, {onDelete: 'CASCADE', cascade: true})
    user: UserEntity;

    @ManyToOne(type => CategoryEntity, category => category.subcategories)
    category: CategoryEntity;

    @OneToMany(type => CategoryEntity, category => category.category)
    subcategories: CategoryEntity[];

我不久前才知道,这就是所谓的自引用(或修饰)实体。

这是我保存子类别的方式:

    public async createCategoryByUserId(userId: number, createCategoryDto: CreateCategoryDto): Promise<void> {
        const category = await this.categoryRepository.createQueryBuilder('category')
                                                      .where('category.user.id = :userId', {userId})
                                                      .andWhere('category.id = :id', {id: createCategoryDto.id})
                                                      .getOne();

        const subcategory = new CategoryEntity();
        subcategory.setName(createCategoryDto.name)
                   .setIsBaseTemplate(false)
                   .setSection(category.section);

        await this.categoryRepository.save(subcategory);

        const newCategory = new CategoryEntity();

        Object.assign(newCategory, category);

        const subcategories = (await this.categoryRepository.createQueryBuilder('category')
                                   .where('category.user.id = :userId', {userId})
                                   .andWhere('category.id = :id', {id: createCategoryDto.id})
                                   .leftJoinAndSelect('category.subcategories', 's')
                                   .getOne()).subcategories;

        newCategory.subcategories = [...subcategories, subcategory];

        await this.categoryRepository.save(newCategory);

问题是,在类别表中,每个类别都有一个用户ID,但子类别与类别(而不是用户)相关,而不是用户,其userId是NULL s。

我正在尝试编写一个请求,该请求将通过用户ID和类别/子类别ID返回类别/子类别。我认为,如果子类别具有与之关联的userId,那会更容易。但是有可能吗?

也许我只是用错误的方式保存它,我是Typeorm的新手,对不起。

0 个答案:

没有答案