Mikro-orm:如何从带有聚合的查询中获取结果到他们自己的实体中?
Mikro-orm: How to get results from queries with aggregates into their own entity?
假设我有 User
和 Post
实体 User
一对多 Post
。我想获取 id
、username
、post_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
假设我有 User
和 Post
实体 User
一对多 Post
。我想获取 id
、username
、post_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()
:
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