【发布时间】:2021-01-14 12:36:50
【问题描述】:
假设我有这些实体:
用户
@Entity('user', { synchronize: true })
export class UserEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
firstName: string;
@Column()
lastName: string;
@OneToMany(type => PostEntity, post => post.user)
posts: PostEntity[];
}
发帖
@Entity('post', { synchronize: true })
export class PostEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@ManyToOne(type => UserEntity , user => user.posts)
@Index()
user: UserEntity ;
@Column({ nullable: true })
text: string;
}
我想要的是一个随机帖子,连同它的相关用户,嵌套在对象的用户属性中。
使用实际的 TypeORM 存储库类,我可以轻松做到这一点:
public async getOnePost(): Promise<PostEntity> {
return await this.findOneOrFail({
relations: ['user']
});
这会产生一个带有用户属性的 PostEntity 对象,该用户属性本身就是一个结构良好的 UserEntity 对象。
但是为了从数据库中获取 random 行,看来我必须使用 TypeORM QueryBuilder。我管理过这样的事情:
const array = await this.createQueryBuilder()
.select('*')
.from(PostEntity , 'post')
.leftJoinAndSelect('post.user','user')
.orderBy('RANDOM()')
.limit(1)
.execute();
return array[0];
玩弄我只能得到的 realtion/join 函数和参数:
- 仅向 PostEntity 对象添加了 1 个属性“userId”
- “userId”属性和所有其他用户属性添加“平面”到 PostEntity 对象
- 添加了“userId”属性,而所有其他用户属性都添加了“扁平”别名:user_id、user_firstName 等。
那么,使用 QueryBuilder,我怎样才能得到这样的帖子:
{
id: 'e43c918c-55e1-4511-bce4-910fdd503548',
text: 'this is some text',
user: {
id: '123456789',
firstName: 'John',
lastName: 'Doe',
},
}
【问题讨论】:
标签: typescript nestjs query-builder typeorm