Микро-орм: Как получить результаты запросов с агрегатами в отдельную сущность?

Предположим , у меня есть 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

Другие вопросы по тегам