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



我有两个模型命名为ActivityActivityAttendants。一个活动可以有多个活动助理(1:M)。这是我的两个TypeORM模型

<<p>活动模型/strong>
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[];
}
<<p>ActivityAttendants模型/strong>
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;
}

为简洁起见,我删除了所有其他不必要的字段。

现在,当我左连接ActivityAttendantsActivity时,我期望输出如下:

[
{
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(它将有一个createdAt字段用于orderderby)表中的3个(不多于)最近的服务员的数组。

这是我到目前为止所做的。

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();

它只是做组concat,为recent_attendants字段中的每个元素返回一个JSON。而且,用这种方法是不可能进行排序和限制的。

是否有可能使用TypeORM querybuilder获得预期的输出,或者我必须以编程方式进行数据塑造?

好了,在运行你的代码后,我认为我明白你想要做什么。

据我所知,您正试图返回一个对象层次结构,子实体仅限于始终显示最新的n条目…

鉴于此,我首先想到的是您将.leftJoinAndMapMany().select()结合使用是不正确的。您不能像那样使用这些方法,因为.select()是用于SELECT的单个数据库列。在本例中,aj是由.leftJoinAndSelect返回的子实体数组,此时TypeORM将其转换为GROUP_CONCAT()表达式。

在我看来,你可能不得不使用.slice()或类似的代码来做数据争用。

最新更新