0

假设我有一对多UserPost实体。我想用, ,获取用户列表。用于此的 sql 查询如下所示:UserPostidusernamepost_count

select u.id, u.username, count(p.id)
from users u left join posts p on u.id = p.user_id
group by u.id

我想将此查询的结果提取到它自己的实体中,例如

class PostsCountPerUser {
  id: string;
  username: string;
  count: number
}

我怎样才能通过 mikro-orm 做到这一点?

4

1 回答 1

2

不支持视图实体,这几乎是您所要求的 - 您可以在此处订阅:

https://github.com/mikro-orm/mikro-orm/issues/672

您可以通过查询生成器执行您想要的查询(或直接执行原始 SQL),并通过以下方式将结果作为 POJO 获取qb.execute()

const res = await em.createQueryBuilder(User, 'u')
  .select(['u.id', 'u.username', 'count(p.id) as count'])
  .leftJoin('u.posts', 'p')
  .groupBy('u.id')
  .execute();

或作为User实体通过qb.getResult(). 对于这种方法,您还需要定义一个非持久属性,然后您可以将 QB 结果映射到该属性 - 所以在这种情况下count

@Entity()
class User {
  @Property({ persist: false })
  count?: number;
}

const users = await em.createQueryBuilder(User, 'u')
  .select(['u.id', 'u.username', 'count(p.id) as count'])
  .leftJoin('u.posts', 'p')
  .groupBy('u.id')
  .getResult();

在 v4 中,你也可以使用@Filter()它,你可以定义一个子查询来给你计数:

https://github.com/mikro-orm/mikro-orm/blob/dev/docs/docs/defining-entities.md#formulas

于 2020-07-26T21:26:14.943 回答