exemple du document de doctrine :
La construction INDEX BY n'est rien qui se traduise directement en SQL mais qui affecte l'hydratation des objets et des tableaux. Après chaque clause FROM et JOIN, vous spécifiez par quel champ cette classe doit être indexée dans le résultat. Par défaut, un résultat est incrémenté par des clés numériques commençant par 0. Cependant, avec INDEX BY, vous pouvez spécifier n'importe quelle autre colonne comme clé de votre résultat, cela n'a vraiment de sens qu'avec des champs primaires ou uniques :
SELECT u.id, u.status, upper(u.name) nameUpper FROM User u INDEX BY u.id
JOIN u.phonenumbers p INDEX BY p.phonenumber
Renvoie un tableau du type suivant, indexé à la fois par user-id puis phonenumber-id :
array
0 =>
array
1 =>
object(stdClass)[299]
public '__CLASS__' => string 'Doctrine\Tests\Models\CMS\CmsUser' (length=33)
public 'id' => int 1
..
'nameUpper' => string 'ROMANB' (length=6)
1 =>
array
2 =>
object(stdClass)[298]
public '__CLASS__' => string 'Doctrine\Tests\Models\CMS\CmsUser' (length=33)
public 'id' => int 2
...
'nameUpper' => string 'JWAGE' (length=5)