TypeORM:将不相关的实体映射到数组属性 [英] TypeORM: mapping unrelated entities into an array property
本文介绍了TypeORM:将不相关的实体映射到数组属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下不相关的TypeORM实体(由于各种原因,我不能对它们使用一个/多个关系):
@Entity()
export class Book {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
}
@Entity()
export class BookCategory {
@PrimaryGeneratedColumn()
id: number;
@Column()
bookId: number;
@Column()
name: string;
}
包含一本书、两个分配的类别和以下查询:
const query = this.bookRepository
.createQueryBuilder('book')
.leftJoinAndSelect(BookCategory, 'category', 'book.id = category.bookId');
return query.execute();
我收到以下响应:
[
{
"book_id": 1,
"book_name": "Lorem Ipsum",
"category_id": 1,
"category_name": "non-fiction"
},
{
"book_id": 1,
"book_name": "Lorem Ipsum",
"category_id": 2,
"category_name": "documentary"
}
]
如您所见,我有两个对象。是否可以使用TypeORM查询获得以下内容?
[
{
"id": 1,
"name": "Lorem Ipsum",
"categories": ["non-fiction", "documentary"]
}
]
即,我正在尝试将查询结果绑定到虚拟属性categories
。这可能吗?
推荐答案
我认为使用TypeORM本身不可能做到这一点,但是您可以通过以下方式使用map()
函数来实现:
const categories: string[] = query.execute().map((book) => book.category_name );
const book = {id: bookArray[0].book_id, name: bookArray[0].book_name, categories};
//OUTPUT:
{
id: 1,
name: 'Lorem Ipsum',
categories: [ 'non-fiction', 'documentary' ]
}
这不是干净利落的做法,但由于您是按ID请求一本书,因此您将确保book_id
和book_name
属性在每个数组对象中始终相同。
TypeORM还建议使用getMany()
或getOne()
而不是执行查询:
const books: Book[] = await this.bookRepository
.createQueryBuilder('book')
.leftJoinAndSelect(BookCategory, 'category', 'book.id = category.bookId')
.getMany();
这篇关于TypeORM:将不相关的实体映射到数组属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文