![](/img/trans.png)
[英]How to do a Subqueries join with TypeORM QueryBuilder (relation of a relation of a relation)
[英]TypeORM: Select RANDOM() with a nested relation using QueryBuilder
假設我有這些實體:
用戶
@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 對象具有一個 user 屬性,它本身就是一個結構良好的 UserEntity 對象。
但是為了從數據庫中獲取隨機行,似乎我必須使用 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 函數和參數我只能得到:
所以,使用 QueryBuilder,我怎樣才能得到這樣的帖子:
{
id: 'e43c918c-55e1-4511-bce4-910fdd503548',
text: 'this is some text',
user: {
id: '123456789',
firstName: 'John',
lastName: 'Doe',
},
}
我在嘗試進行原始查詢時遇到了同樣的問題,我發現的解決方案是使用JSONB_BUILD_OBJECT()
https://www.postgresql.org/docs/9.5/functions-json.html
基本上你的查詢看起來像這樣:
select
post.*,
jsonb_build_object(
'id', user."id",
'firstName', user."firstName",
'lastName', user."lastName"
) "user"
from...
我很想知道是否有使用 typeorm 子句的優雅方法,但是當我遇到這些 API 問題時,我通常只使用原始查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.