@Entity()
export class Product {
// 자동으로 1씩 증가해 생성되는 값 (sequence)
@PrimaryGeneratedColumn()
@IsNumber()
id: number;
@Column()
@IsString()
name: string;
@Column()
@IsNumber()
price: number;
@ManyToOne((type) => Categories, (category) => category.products)
@JoinColumn()
category: Categories;
여러 개의 product가 같은 category 값을 가질 수 있으므로 ManyToOne
이 때, JoinCoulmn 사용 시 해당 column이 자동으로 생성되는데 (categoryId)
@Column({ nullable: true })
@IsNumber()
categoryId: number;
}
생성된 column과 같은 이름으로 @Column을 정의해주면 연결 됨
Insert 와 Update 시에도 적용
위와 같은 방법보다는 Product에
@RelationId((product: Product) => product.categoryId)
로 생성된 내부 컬럼을 명시하여 선언하고 사용할 것
@Entity()
export class Categories {
@PrimaryGeneratedColumn()
@IsNumber()
id: number;
@Column()
@IsString()
categoryName: string;
@OneToMany((Type) => Product, (product) => product.category)
products: Product[];
}
category 하나에 product가 여러 개 있을 수 있으므로 OneToMany
async getAll(): Promise<ProductsOutput> {
try {
return {
ok: true,
data: await this.products.find({ relations: ['category'] }),
};
} catch (e) {
return {
ok: false,
error: e,
};
}
}
기존의 find()
가 아닌 find({ relations: ['category'] })
사용
async getOne(id: number): Promise<ProductOutput> {
try {
// throw new BadRequestException();
return {
ok: true,
data: await this.products.findOne(id, { relations: ['category'] }),
};
} catch (e) {
return {
ok: false,
error: e,
};
}
}
findOne(id, { relations: ['category'] })
사용
async create(productData: CreateProductDto): Promise<void> {
try {
const product = this.products.create(productData);
// DB에 create가 아닌 product 객체에 create
await this.products.save(product);
// product 객체 DB에 save
} catch (e) {
console.log('error');
}
}
async update(id: number, updateData): Promise<void> {
try {
await this.products.update(id, updateData);
} catch (e) {
console.log('error');
}
}
{
"name": "22",
"price": 1221,
"categoryId": 1
}