Микро-орм: Как получить результаты запросов с агрегатами в отдельную сущность?
Предположим , у меня есть 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
}
Как это сделать через микро-орм?
1 ответ
Нет поддержки для сущностей просмотра, что в значительной степени то, о чем вы просите - вы можете подписаться здесь:
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