1: <?php
2: namespace TIC\DormBundle\Hydration;
3:
4: use Doctrine\ORM\Internal\Hydration\ObjectHydrator;
5:
6: /**
7: * Récupération d'une liste d'entités en les regroupants selon la valeur d'une colonne supplémentaire.
8: *
9: * Exemple:
10: * > SELECT a, a.category FROM t
11: * < array(
12: * c1 => array( a1, a2... )
13: * c2 => array( a1, a3, a5... )
14: * ...
15: * )
16: */
17: class GroupobjHydrator extends ObjectHydrator
18: {
19:
20: /**
21: * Hydrates all rows from the current statement instance at once.
22: *
23: * @return mixed[]
24: */
25: protected function hydrateAllData(): array
26: {
27: $result = array();
28:
29: $group_index = null;
30: foreach (parent::hydrateAllData() as $row) {
31:
32: // la 1ère colonne ne contenant pas un objet sera utilisée comme groupe
33: if ($group_index === null) foreach ($row as $index => $value) {
34: if (! \is_object($value)) { $group_index = $index; break; }
35: }
36:
37: // initialisation du groupe dans les résultats
38: $group = $row[$group_index];
39: if ($group === null || $group === '') $group = "default";
40: if (! isset($result[$group])) $result[$group] = array();
41:
42: // la 1ère colonne contenant un objet sera ajoutée au groupe
43: foreach ($row as $index => $value) {
44: if ($index !== $group_index) { $result[$group][] = $value; break; }
45: }
46: }
47:
48: return $result;
49: }
50:
51: }
52: