Mikro-orm:如何从带有聚合的查询中获取结果到他们自己的实体中?

Mikro-orm: How to get results from queries with aggregates into their own entity?

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

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 执行此操作?

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

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

您可以通过查询生成器执行您想要的查询(或直接执行原始 SQL),并通过 qb.execute():

以 POJO 形式获取结果
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();

或通过 qb.getResult() 作为 User 实体。对于这种方法,您还需要定义一个非持久性 属性,然后您可以将 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