TypeOrm“leftJoinAndMapMany”与子查询

问题描述 投票:0回答:1

我有 2 个表 - 订阅和周期。我正在尝试加入我的订阅中的第一期和最后一期。这是我如何添加子查询的部分代码。

export class SubscriptionQueryBuilder {

 private readonly qb: SelectQueryBuilder<SubscriptionSchema>;

 constructor(
    private readonly repository: Repository<SubscriptionSchema>,
  ) {
    this.qb = this.repository.createQueryBuilder('sub');
    ...
    this.addPeriodsQuery();
 }

 ...

 private addPeriodsQuery() {
    const subquery = `
    SELECT "period"."id" AS periods_id, 
           "period"."subscription_id" AS periods_subscription_id,
           "period"."start" AS periods_start,
           "period"."end" AS periods_end,
           ROW_NUMBER() OVER (PARTITION BY "period"."subscription_id" ORDER BY "period"."start" DESC) AS "start_rank",
           ROW_NUMBER() OVER (PARTITION BY "period"."subscription_id" ORDER BY "period"."end" ASC) AS "end_rank"
    FROM "subscription_period" "period"
  `;

    this.qb
      .leftJoinAndMapMany(
        'sub.periods',
        `(${subquery})`,
        'periods',
        'sub.id = periods.periods_subscription_id',
      )
      .andWhere('periods.start_rank = 1 OR periods.end_rank = 1');
  }

生成的 SQL 查询似乎是正确的,但 typeorms 映射器只是没有将数据映射到属性。

@Entity()
export class SubscriptionSchema {
  @PrimaryGeneratedColumn('uuid', {})
  id: string;
  ...

  public periods?: SubscriptionPeriodSchema[];
  ... 

有人成功使用

leftJoinAndMapMany
leftJoinAndMapOne
进行子查询吗?

typeorm
1个回答
0
投票

最后,我完成了基于

getRawAndEntities
的解决方案。由于某种原因,我错过了这个方法。这并不理想,但存储库模式可以让您手动完成映射。

© www.soinside.com 2019 - 2024. All rights reserved.