Mikro-orm:如何将聚合查询的结果获取到自己的实体中?

kap*_*v89 2 node.js typescript mikro-orm

假设我有User和一对多 的Post实体。我想获取带有, ,的用户列表。其 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
Run Code Online (Sandbox Code Playgroud)

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

class PostsCountPerUser {
  id: string;
  username: string;
  count: number
}
Run Code Online (Sandbox Code Playgroud)

我如何通过 mikro-orm 做到这一点?

Mar*_*mek 7

不支持视图实体,这正是您所要求的 - 您可以在这里订阅:

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

编辑:现在(v5)也有虚拟实体

您可以通过查询生成器执行您想要的查询(或直接执行原始 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();
Run Code Online (Sandbox Code Playgroud)

或者作为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();
Run Code Online (Sandbox Code Playgroud)

在 v4 中,您也可以使用@Filter()此方法,您可以定义一个子查询来提供计数:

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