gpt4 book ai didi

nestjs - 是否可以在 TypeORM 的 leftJoinAndSelect 中使用子查询

转载 作者:行者123 更新时间:2023-12-03 19:13:47 25 4
gpt4 key购买 nike

所以我有一个关于 nestjs 并使用 TypeORM 的项目。我的情况是我有一个与 UserSubscrption 有一对一关系的用户。默认查找查询按原样将所有订阅添加到用户。所以现在我想找到一个特定的订阅,例如上次添加。所以我构建了这个查询:

    const query = this.createQueryBuilder("user")
.leftJoinAndSelect("user.settings", "settings")
.leftJoinAndSelect(
subQuery => {
return subQuery
.select()
.from(UserSubscription, "subscription")
.where("subscription.userId = :id AND subscription.isConfirmed = :isConfirmed", { id, isConfirmed: true })
.orderBy('"createdDate"', 'DESC')
.limit(1);
}, 'subscription', '"subscription"."userId" = "user"."id"')
.where('user.id = :id', { id });
const result = await query.getOne(); // await query.execute()

首先,我尝试只执行查询,它工作正常,但所有数据都没有结构化
[
{
user_id: 1,
user_username: 'name',
...
settings_id: 1,
settings_ifOnline: true,
...
subscriptions_id: 1,
subscriptions_subscriptionId: 1,
...
}
]

所以不好。

然后我尝试 query.getOne() 但它不会像我想要的那样工作,它丢失了所有订阅数据
User {
id: 1,
username: 'name',
...
settings: UserNotificationSettings {
id: 1,
ifOnline: true,
...
}
}

此外,我尝试向用户实体添加虚拟字段订阅并尝试使用 leftJoinAndMapOne:
    ...
.leftJoinAndSelect("user.settings", "settings")
.leftJoinAndMapOne("user.subscription",
subQuery => {
return subQuery
.select()
.from(UserSubscription, "subscription")
.where("subscription.userId = :id AND subscription.isConfirmed = :isConfirmed", { id, isConfirmed: true })
.orderBy('"createdDate"', 'DESC')
.limit(1);
}, 'subscription', '"subscription"."userId" = "user"."id"')
...

但没有运气。在文档中说“FROM、WHERE 和 JOIN 表达式支持子查询”。但没有提供示例。所以,我不知道如何处理这个我相信 TypeORM 的查询非常简单。有什么建议?我有点坚持这个。可能有比 buildibg 查询更好的方法吗?谢谢。

用户实体
 export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
...

// subscription: UserSubscription;

@OneToMany(type => UserSubscription, subscriptions => subscriptions.user, { cascade:true })
subscriptions: UserSubscription[];

@OneToOne(type => UserNotificationSettings, settings => settings.user, { cascade:true })
settings: UserNotificationSettings;
}

用户订阅.实体
export class UserSubscription extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;

@OneToOne(type => Subscription)
@JoinColumn()
subscription: Subscription

@Column()
subscriptionId: number

@ManyToOne(type => User, user => user.subscriptions)
user: User

@Column({type: 'integer'})
userId: number

@Column({ type: 'boolean', default: false })
isConfirmed: boolean

...
}

最佳答案

使用 SubQueryFactory选项不会自动创建 on子句作为条件,因为它不知道您要连接的基础查询的别名是什么。它没有 .leftJoinAndSelect('user.photos', 'photos') 的元数据提供的上下文。因为它是如何写的。
相反,您必须明确定义条件。在你的情况下:

const result = await userRepo
.createQueryBuilder('user')
.leftJoinAndSelect(
qb => qb
.select()
.from(UserPhotos, 'p')
.orderBy({ 'p.updatedAt': 'ASC' })
.limit(5),
'photos',
'photos.userId = user.id' // the answer
)
.getRawMany() // .getMany() seems not working
这是实际的答案:
https://github.com/typeorm/typeorm/issues/6767
更新
我看到了 .getMany()使用 SubQueryFactory 时不起作用.你可以使用 .getRawMany() .
如果我错了,请纠正我...

关于nestjs - 是否可以在 TypeORM 的 leftJoinAndSelect 中使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61275599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com