Binnen een Symfony 3 en Doctrine project gebruik ik repositories die per entity gemapt zijn. In de meeste gevallen werk ik rechtstreeks met de entities die ik terugkrijg uit de repositories, maar in sommige gevallen is het nodig om complexe SQL/DQL queries te schrijven die niet direct naar mijn bestaande entities gemapt kunnen worden.
Een voorbeeld van zo een query is uit mijn database van "kaarten" een overzicht halen hoeveel van een specifieke kaart de gebruiker in zijn verzameling heeft per kaartconditie.
Het resultaat past dus niet binnen mijn entities en wordt standaard als assoc array teruggegeven. Omdat het resultaat op meerdere plaatsen gebruikt wordt, lijkt het me verstandig het resultaat naar een klasse te mappen ipv een assoc array te gebruiken.
Hierbij heb ik 2 vragen:
1. Is het mogelijk doctrine custom hydration te laten doen naar een niet-entity klasse?
2. Indien ja, waar breng ik deze classes best onder binnen mijn applicatiearchitectuur? Momenteel zitten mijn entities in een AppBundle\Entity namespace en mijn repositories in een AppBundle\Repository namespace. Deze classes zijn eigenlijk voornamelijk containers voor de teruggekregen data, dus ik weet niet zeker of dit wel binnen mijn domain laag past. Aangezien ze sterk gekoppeld zijn met de repository zelf, misschien AppBundle\Repository\Model?
Een voorbeeld van zo een query is uit mijn database van "kaarten" een overzicht halen hoeveel van een specifieke kaart de gebruiker in zijn verzameling heeft per kaartconditie.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| SELECT cardCondition.id, cardCondition.name, COALESCE(cardVariantInCollection.amount, 0) AS amountHave FROM AppBundle:CardCondition cardCondition INDEX BY cardCondition.id LEFT JOIN AppBundle:CardVariantInCollection cardVariantInCollection WITH cardVariantInCollection.cardCondition = cardCondition.id AND cardVariantInCollection.user = :userId AND cardVariantInCollection.cardVariant = ( SELECT cardVariant.id FROM AppBundle:CardVariant cardVariant WHERE cardVariant.card = :cardId AND cardVariant.cardVariantType = :cardVariantTypeId ) ORDER BY cardCondition.id ASC |
Het resultaat past dus niet binnen mijn entities en wordt standaard als assoc array teruggegeven. Omdat het resultaat op meerdere plaatsen gebruikt wordt, lijkt het me verstandig het resultaat naar een klasse te mappen ipv een assoc array te gebruiken.
Hierbij heb ik 2 vragen:
1. Is het mogelijk doctrine custom hydration te laten doen naar een niet-entity klasse?
2. Indien ja, waar breng ik deze classes best onder binnen mijn applicatiearchitectuur? Momenteel zitten mijn entities in een AppBundle\Entity namespace en mijn repositories in een AppBundle\Repository namespace. Deze classes zijn eigenlijk voornamelijk containers voor de teruggekregen data, dus ik weet niet zeker of dit wel binnen mijn domain laag past. Aangezien ze sterk gekoppeld zijn met de repository zelf, misschien AppBundle\Repository\Model?