Przypuśćmy, że mam User i Post jednostki User jeden do-wielu Post. Chcę pobrać listę użytkowników z id, username, post_count. Zapytanie SQL dla tego wyglądało:

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

Chcę przynieść wyniki tego zapytania do własnego podmiotu, jak

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

Jak mogę to zrobić za pośrednictwem Mikro-Orm?

0
kapv89 26 lipiec 2020, 08:48

1 odpowiedź

Najlepsza odpowiedź

Nie ma wsparcia dla podmiotów widokowych, co jest prawie tego, o co prosisz - możesz tutaj subskrybować:

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

Możesz wykonać zapytanie, które chcesz za pośrednictwem Builder Query (lub wykonaj surowy SQL bezpośrednio) i uzyskać wynik jako POJO przez 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();

Lub jako jednostka User przez qb.getResult(). W tym podejściu musisz również zdefiniować nieustającej nieruchomości, do której można następnie mapować wynik QB - więc w tym przypadku 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();

W V4 można również użyć @Filter(), gdzie można zdefiniować podzewności, które daje ci liczbę:

https://github.com/mikro-orm/mikro-orm/Blob/dev/docs/docs/defining-entiess.md#formulas.

1
Martin Adámek 26 lipiec 2020, 21:26