Supongamos que tengo entidades User y Post con User uno a muchos Post. Quiero obtener una lista de usuarios con id, username, post_count. La consulta sql para esto se vería así:

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

Quiero obtener los resultados de esta consulta en su propia entidad, como

class PostsCountPerUser {
  id: string;
  username: string;
  count: number
}

¿Cómo puedo hacer esto a través de mikro-orm?

0
kapv89 26 jul. 2020 a las 08:48

1 respuesta

La mejor respuesta

No hay soporte para entidades de vista, que es más o menos lo que está pidiendo; puede suscribirse aquí:

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

Puede realizar la consulta que desee mediante el generador de consultas (o ejecutar un SQL sin formato directamente) y obtener el resultado como POJO a través de 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();

O como la entidad User a través de qb.getResult(). Para este enfoque, también necesita definir una propiedad no persistente a la que luego pueda asignar el resultado QB, por lo que en este caso 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();

En v4, también podría usar @Filter() para esto, donde podría definir una subconsulta que le dará el recuento:

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

1
Martin Adámek 26 jul. 2020 a las 21:26