TypeORM将非规范化数据解析为父/子实体关系

时间:2019-10-02 16:31:03

标签: typescript typeorm

我有一个我无法控制的数据源,无法以非规范化格式更改它。我需要将这些数据解析为标准化的对象图。有趣的是,数据以归一化并连接在一起时的形状存储。

我想告诉TypeORM解析这些数据,就像在ORM建立查询时一样。

例如,考虑以下数据:

userId | userName | photoUrl | photoCaption
-------------------------------------------
1      | Lu       | <url1>   | photo 1
1      | Lu       | <url2>   | photo 2
2      | Pat      | <url3>   | photo 3
2      | Pat      | <url4>   | photo 4

我想得到一个形状如下的对象图:

[
  {
    userId: 1, userName: 'Lu', 
    photos: [
      { photoUrl: <url1>, photoCaption: 'photo 1' },
      { photoUrl: <url2>, photoCaption: 'photo 2' }
    ]
  },
  {
    userId: 2, userName: 'Pat', 
    photos: [
      { photoUrl: <url3>, photoCaption: 'photo 3' },
      { photoUrl: <url4>, photoCaption: 'photo 4' }
    ]
  }
]

如果我的数据被标准化,那将是微不足道的一对多:

id | userName 
------------------
1      | Lu       
2      | Pat      


userId | photoUrl | photoCaption
-------------------------------------------
1      | <url1>   | photo 1
1      | <url2>   | photo 2
2      | <url3>   | photo 3
2      | <url4>   | photo 4

有趣的是,产生的查询大致是:

SELECT users.*, photos.*
FROM users
LEFT JOIN photos
  ON users.id = photos.userId;

与我实际存储在表中的数据结构相同。

是否有一种方法可以让TypeORM将这些数据解析为父子结构,就像它本身已经生成了查询一样?

类似这样的东西:

@Entity()
class Photo extends BaseEntity {
  @PrimaryColumn() photoId!: number;
  @Column() photoUrl!: string;
  @Column() photoCaption!: string;
}

@Entity()
class UserPhotos extends BaseEntity {
  @PrimaryColumn() id!: number;
  @Column() userName!: string;

  @SomethingMagicalAndWonderful()
  photos: Photo[]
}

或者也许使用OneToMany但有一些棘手的配置表明它不是真正的联接?

0 个答案:

没有答案