簡體   English   中英

TypeORM:使用 QueryBuilder 選擇具有嵌套關系的 RANDOM()

[英]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 函數和參數我只能得到:

  1. 只有 1 個屬性“userId”添加到 PostEntity 對象
  2. "userId" 屬性和所有其他用戶屬性添加了 "flat" 到 PostEntity 對象
  3. 添加了“userId”屬性,而所有其他用戶屬性都添加“flat”並帶有別名:user_id、user_firstName 等。

所以,使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM