exemplo do documento de doutrina:
A construção INDEX BY não é nada que se traduz diretamente em SQL, mas que afeta a hidratação de objetos e arrays. Após cada cláusula FROM e JOIN você especifica por qual campo esta classe deve ser indexada no resultado. Por padrão, um resultado é incrementado por chaves numéricas começando com 0. No entanto, com INDEX BY você pode especificar qualquer outra coluna para ser a chave do seu resultado, mas realmente só faz sentido com campos primários ou exclusivos:
SELECT u.id, u.status, upper(u.name) nameUpper FROM User u INDEX BY u.id
JOIN u.phonenumbers p INDEX BY p.phonenumber
Retorna um array do tipo a seguir, indexado por user-id e 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)
documento de doutrina