TypeORM:将不相关的实体映射到数组属性 [英] TypeORM: mapping unrelated entities into an array property

查看:42
本文介绍了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_idbook_name属性在每个数组对象中始终相同。

TypeORM还建议使用getMany()getOne()而不是执行查询:

const books: Book[] = await this.bookRepository
  .createQueryBuilder('book')
  .leftJoinAndSelect(BookCategory, 'category', 'book.id = category.bookId')
  .getMany();

这篇关于TypeORM:将不相关的实体映射到数组属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆