【问题标题】:Entering values in a many-to-many relationship : NestJS以多对多关系输入值:NestJS
【发布时间】:2021-10-08 21:43:02
【问题描述】:

我有一个名为Items 的表和一个名为Categories 的表。它们之间存在多对多的关系,意味着一个项目可以属于多个类别,并且一个类别可以包含多个项目。

图像视图:

我正在使用带有 TypeORM 的 NestJS。

我的问题是在数据库中输入一个项目,并在一个请求中将它所属的多个类别传递给它。不需要对类别执行相同操作,因为它们已经在数据库中播种并且数量固定。

目前的“解决方案”是使用createItemDto 中传递的categoryID 查找类别,然后在createItem 方法中将当前项目添加到类别实体的itemsarray 中。

items.service.ts 中的 CreateItem 方法

  async createItem(
    createItemDto: CreateItemDto,
    user: User,
    category: Category,
  ): Promise<Item> {
    const newItem = await this.itemsRepository.save({
      name: createItemDto.name,
      description: createItemDto.description,
      price: createItemDto.price,
      delivery: createItemDto.delivery,
      cancellation: createItemDto.cancellation,
      rating: createItemDto.rating,
      imageUrl: createItemDto.imageUrl,
    });

    user.items = [...user.items, newItem];
    await user.save();

    category.items = [...category.items, newItem];
    await category.save();

    return newItem;
  }
}

items controller.ts

@Post('/createitem')
  async createItem(@Body() createItemDto: CreateItemDto): Promise<Item> {
    const user = await this.authService.getUserById(createItemDto.userId);
    const category = await this.categoriesService.getCategoryById(
      createItemDto.categoryId,
    );
    return this.itemsService.createItem(createItemDto, user, category);
  }

物品实体

import { Category } from './category.entity';
import { Rent } from './rent.entity';
import { User } from './user.entity';
import {
  BaseEntity,
  Column,
  Entity,
  JoinTable,
  ManyToMany,
  ManyToOne,
  OneToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';

@Entity('item')
export class Item extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  description: string;

  @Column()
  price: number;

  @Column()
  delivery: boolean;

  @Column()
  cancellation: boolean;

  @Column({ nullable: true })
  rating: number;

  @Column()
  imageUrl: string;

  @ManyToOne(() => User, (user) => user.items, {
    onDelete: 'CASCADE',
  })
  user: User;

  @OneToOne(() => Rent, (rent) => rent.item)
  rent: Rent;

  @ManyToMany(() => Category, (category) => category.items)
  @JoinTable()
  categories: Category[];
}

类别实体

import { Item } from './item.entity';
import {
  BaseEntity,
  Column,
  Entity,
  JoinTable,
  ManyToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';

@Entity()
export class Category extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  category: string;

  @ManyToMany(() => Item, (item) => item.categories)
  items: Item[];
}

分类服务

import { Category } from './../entities/category.entity';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { CategoriesRepository } from './categories.repository';

@Injectable()
export class CategoriesService {
  constructor(
    @InjectRepository(CategoriesRepository)
    private categoriesRepository: CategoriesRepository,
  ) {}

  async getCategoryById(id: number): Promise<Category> {
    return await this.categoriesRepository.findOne(id, {
      relations: ['items'],
    });
  }
}

【问题讨论】:

  • 您的问题到底是什么?实施解决方案?
  • 我想处理用户(在前端)想要添加一个项目并为其分配多个类别的情况。我不知道如何在后端代码中实现这一点
  • 检查我的答案
  • 优霸,非常感谢。这非常有效。

标签: javascript nestjs typeorm


【解决方案1】:

正如你所说添加一个项目并为其分配多个类别

首先,您应该编辑您的createItemDto,使categoryId 接受一个类别数组,我们称之为categoryIds

@Post('/createitem')
  async createItem(@Body() createItemDto: CreateItemDto): Promise<Item> {
    const user = await this.authService.getUserById(createItemDto.userId);
    const categories = await this.categoriesService.getCategoryByIds(
      createItemDto.categoryIds); // Create a function accept array 
                               //of  ids, it'll has a query such as [1]
    return this.itemsService.createItem(createItemDto, user, categories);
  }

[1] getCategoryByIds

async getCategoryByIds(ids:Array<number>) {
    return await this.categoryRepository.find({ where: { id: In(ids) }});
}

最后,对createItem进行一些更改

async createItem(
    createItemDto: CreateItemDto,
    user: User,
    categories: Array<Category>, // Make the param accept list of categories 
  ): Promise<Item> {
    const newItem = await this.itemsRepository.save({
      name: createItemDto.name,
      description: createItemDto.description,
      price: createItemDto.price,
      delivery: createItemDto.delivery,
      cancellation: createItemDto.cancellation,
      rating: createItemDto.rating,
      imageUrl: createItemDto.imageUrl,
      categories :  categories // you only need to assign categories from item side 
    });

    user.items = [...user.items, newItem];
    await user.save();

    return newItem;
  }
}

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2022-01-15
    • 2021-02-04
    • 2021-08-09
    • 2020-08-15
    • 2012-05-06
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多