所以我有一个关于 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()
Run Code Online (Sandbox Code Playgroud)
首先,我尝试只执行查询,它工作正常,但所有数据都没有结构化
[
{
user_id: 1,
user_username: 'name',
...
settings_id: 1,
settings_ifOnline: true,
...
subscriptions_id: 1,
subscriptions_subscriptionId: 1,
...
}
]
Run Code Online (Sandbox Code Playgroud)
所以不好。
然后我尝试 query.getOne() 但它不会像我想要的那样工作,它丢失了所有订阅数据
User {
id: 1,
username: 'name',
...
settings: UserNotificationSettings {
id: 1,
ifOnline: true,
...
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我尝试向用户实体添加虚拟字段订阅并尝试使用 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"')
...
Run Code Online (Sandbox Code Playgroud)
但没有运气。在文档中说“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;
}
Run Code Online (Sandbox Code Playgroud)
用户订阅.实体
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
...
}
Run Code Online (Sandbox Code Playgroud)
使用该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
Run Code Online (Sandbox Code Playgroud)
这是实际答案:https : //github.com/typeorm/typeorm/issues/6767
我看到.getMany()使用SubQueryFactory. 你可以使用.getRawMany().
如果我错了,请纠正我...
| 归档时间: |
|
| 查看次数: |
9636 次 |
| 最近记录: |