Doctrine many to many eager fetch + group by

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • gnoe93
  • Registratie: September 2016
  • Laatst online: 08-04 13:00
Ik heb een entity met een aantal many to many relations. Als ik meerdere entities fetch van de database en deze groupeer per ID (GROUP BY entity.id) en deze wil weergeven in een lijst, zit ik met het probleem dat er telkens een nieuwe query per entity uitgevoerd moet worden om deze many to many relations te fetchen (een simpele fetch join gaat niet omwille van de group by).

De fetchmode op de query specifiek naar "EAGER" zetten, werkt niet zoals te verwachten. Een mogelijke oplossing is de many to many relaties tesamen met een enkele query te fetchen, maar dit wordt echt wel omslachtig. Dit alleen al omdat doctrine niet toelaat entities te fetchen adhv een join alias.

[ Voor 28% gewijzigd door gnoe93 op 08-09-2017 22:21 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
En als je de query zelf schrijft in DQL en als method toevoegt aan je entity repository? Het ORM deel kan niet altijd de beste oplossing verzinnen, die kan niet voorspellen wat jij precies wilt gaan doen. Maar de DBAL kan prima hydraten naar entities.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • gnoe93
  • Registratie: September 2016
  • Laatst online: 08-04 13:00
kwaakvaak_v2 schreef op zaterdag 9 september 2017 @ 08:51:
En als je de query zelf schrijft in DQL en als method toevoegt aan je entity repository? Het ORM deel kan niet altijd de beste oplossing verzinnen, die kan niet voorspellen wat jij precies wilt gaan doen. Maar de DBAL kan prima hydraten naar entities.
Dat is wat ik bedoel met mijn laatste paragraaf, maar dit blijft omslachtig omwille van 2 redenen:

1. Ik zit voor elke custom query met een extra hoop objecten, terwijl die ik eigenlijk liever via de getters van de entity in kwestie zou oproepen. Idealiter zou ik een repository methode willen om één of meer entities te fetchen waar ik een "eagerlyFetchedFields" array argument aan meegeef. Voor elk van deze velden zou dan een query uitgevoerd worden die de verkregen entities merged in de hoofdentities.

2. De meeste entities aan de andere zijde van de many to many relatie zijn eenvoudige "value tabellen" die bijvoorbeeld catorieen bevatten. Het is dus niet logisch hier een terugkoppeling aan toe te voegen voor elke entity die er naar verwijst in een many to many relatie. Dit is belangrijk omdat Doctrine niet toelaat te fetchen met join aliases. Even een voorbeeld:

code:
1
2
3
4
5
6
7
8
9
SELECT
    categoryEntity
FROM
    AppBundle:MainEntity mainEntity
    INNER JOIN mainEntity.categoryEntities categoryEntity
WHERE
    mainEntity.id IN (:mainEntityIds)
ORDER BY
    categoryEntity.id ASC';


Dit gaat dus niet, omdat "categoryEntity" een join alias is; als ik "categoryEntity" wil fetchen moet ik vanuit "CategoryEntity" beginnen. Dit is gaat dus niet tenzij ik in de "CategoryEntity" class een terugkoppeling naar "mainEntities" toevoeg (wat ik liever niet wil).

[ Voor 11% gewijzigd door gnoe93 op 09-09-2017 20:21 ]