【问题标题】:TypeORM: Select RANDOM() with a nested relation using QueryBuilderTypeORM:使用 QueryBuilder 选择具有嵌套关系的 RANDOM()
【发布时间】: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 函数和参数:

  1. 仅向 PostEntity 对象添加了 1 个属性“userId”
  2. “userId”属性和所有其他用户属性添加“平面”到 PostEntity 对象
  3. 添加了“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


    【解决方案1】:

    我在尝试进行原始查询时遇到了同样的问题,我找到的解决方案是使用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 问题时,我通常只使用原始查询。

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 2022-07-12
      • 1970-01-01
      • 2021-07-31
      • 2021-09-18
      • 1970-01-01
      • 2021-09-25
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多