【发布时间】: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