我有两个模型,名为Activity和ActivityAttendants。一个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获得预期的输出,或者我必须以编程方式进行数据整形?
1条答案
按热度按时间ldioqlga1#
好吧,在运行了你的代码之后,我想我明白你想做什么了。
据我所知,您试图返回一个对象层次结构,其中子实体仅限于始终显示最新的
n
条目……考虑到这一点,我首先想到的是,您将
.leftJoinAndMapMany()
与.select()
结合使用是不正确的。您不能像那样使用这些方法,因为.select()
是针对SELECT
的单个数据库列。在本例中,aj
是.leftJoinAndSelect
返回的子实体数组,此时TypeORM将其转换为GROUP_CONCAT()
表达式。在我看来,您可能必须使用
.slice()
或类似的代码来处理数据。