postgresql 如何限制和排序左连接结果并将它们Map到TypeORM中的单个字段

92dk7w1h  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(230)

我有两个模型,名为ActivityActivityAttendants。一个Activity可以有多个Activity Attendants(1:M)。下面是我的两个TypeORM模型

活动模型

export class Activity {
  @PrimaryGeneratedColumn("increment")
  activity_id!: number;

  @Column({ nullable: false })
  title!: string;

  @OneToMany(() => ActivitiyAttendant, (activity_attendants) => activity_attendants.activity, {
    cascade: true,
    onDelete: "CASCADE",
    onUpdate: "CASCADE",
  })
  @JoinColumn({ referencedColumnName: "activity_id" })
  activity_joined!: ActivitiyAttendant[];
}

活动参与者模型

export class ActivitiyAttendant {
  @PrimaryGeneratedColumn("increment")
  activity_attendant_id!: number;

  @Column({ comment: "joined user profile picture" })
  profile_picture!: string;

  @ManyToOne(() => Activity, (activity) => activity.activity_joined)
  @JoinColumn({ name: "activity_id" })
  activity!: Activity;
}

为了简洁起见,我删除了所有其他不必要的字段。
现在,当我用Activity左连接ActivityAttendants时,我期望输出如下:

[
  {
    activity_id: 2,
    title: "Sharable clear-thinking conglomeration",
    recent_attendants: [
      {
        activity_attendant_id: 2110,
        profile_picture: "1f525.svg",
      },
      {
        activity_attendant_id: 271,
        profile_picture: "1f4ce.svg",
      },
      {
        activity_attendant_id: 67,
        profile_picture: "1f525.svg",
      },
    ],
  },
  {
    activity_id: 3,
    title: "Upgradable fault-tolerant emulation",
    recent_attendants: [
      {
        activity_attendant_id: 2697,
        profile_picture: "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg",
      },
      {
        activity_attendant_id: 402,
        profile_picture: "1f1f9-1f1e8.svg",
      },
      {
        activity_attendant_id: 208,
        profile_picture: "1f9ef.svg",
      },
    ],
  },
];

其中,recent_attendants是插入到ActivityAttendant表中的3个(不是更多)最近的服务员的数组(它将有一个用于orderby的createdAt字段)。
以下是我目前所做的。

activityRep
  .createQueryBuilder("a")
  .leftJoinAndMapMany("a.activity_joined", "a.activity_joined", "aj")
  .select([
    "a.activity_id AS activity_id",
    "a.title AS title",
    "aj as recent_attendants",
  ])
  .getRawMany();

它只是做了group concat,为recent_attendants字段中的每个元素返回一个JSON。此外,不可能这样做orderby和限制。
是否可以使用TypeORM querybuilder获得预期的输出,或者我必须以编程方式进行数据整形?

ldioqlga

ldioqlga1#

好吧,在运行了你的代码之后,我想我明白你想做什么了。
据我所知,您试图返回一个对象层次结构,其中子实体仅限于始终显示最新的n条目……
考虑到这一点,我首先想到的是,您将.leftJoinAndMapMany().select()结合使用是不正确的。您不能像那样使用这些方法,因为.select()是针对SELECT的单个数据库列。在本例中,aj.leftJoinAndSelect返回的子实体数组,此时TypeORM将其转换为GROUP_CONCAT()表达式。
在我看来,您可能必须使用.slice()或类似的代码来处理数据。

相关问题