2012-07-04 5 views
13

¿Es posible cambiar los valores de la clave de matriz para getResult() en Doctrine2?Cambiar la clave de matriz getResult para el valor de clave principal

Ejemplo:

$qb->select('t.id, t.name')->from('Table', 't');

Al imprimir esto, me hago, que no es lo que quería:

print_r($qb->getQuery()->getResult());

//Print result: Array ([0] => Array ([id] => 20 [name] => Name1) [1] => Array ([id] => 21 [percentagem] => Name2))

Lo que quiero es:

Array ([20] => Array ([id] => 20 [name] => Name1) [21] => Array ([id] => 21 [percentagem] => Name2))

Sugerencias, sugerencias serían apreciadas.

Respuesta

31

estoy realmente muy feliz por la nueva onda en esta cosa es:

$query = $this->getEntityManager()->createQuery(' 
      SELECT user FROM UserBundle:User user 
      INDEX BY user.id 
      WHERE user.id = 1 
      ' 
     ); 

El ÍNDICE DE constructo hay nada que se traduce directamente en SQL sino que afecta objeto y matriz de hidratación. Después de cada cláusula FROM y JOIN , especifique en qué campo debe indexarse ​​esta clase en el resultado . De forma predeterminada, el resultado se incrementa mediante las teclas numéricas comenzando con 0. Sin embargo, con INDEX BY puede especificar cualquier otra columna para ser la clave de su resultado, realmente solo tiene sentido con campos únicos o únicos.

Fuente: Doctrine ORM 2 Documentation Using INDEX BY

  • Utilice INDICE POR antes DONDE
+0

Enfoque emocionante, pero parece que no funciona con MySql 5.6.16. ¿Deberia? –

+2

@ MatthewT.Baker No es SQL, es DQL y, como se mencionó, no se traduce a nada en la consulta SQL resultante. – Omn

14

Sin embargo, en aras de la exhaustividad, se puede hacer lo mismo con el generador de consultas, como se muestra a continuación:

$queryBuilder = $this->getEntityManager()->createQueryBuilder(); 

$queryBuilder 
    ->select('user') 
    ->from('UserBundle:User', 'user', 'user.id') 
    ->where('user.id = :userId') 
    ->setParameter('userId', $userId) 
; 

var_dump(
    $queryBuilder->getQuery()->getArrayResult() 
); 

Como puedes ver en el índice por opción está disponible como tercer parámetro del generador de consultas from método:

/** 
* Creates and adds a query root corresponding to the entity identified by the given alias, 
* forming a cartesian product with any existing query roots. 
* 
* <code> 
*  $qb = $em->createQueryBuilder() 
*   ->select('u') 
*   ->from('User', 'u') 
* </code> 
* 
* @param string $from The class name. 
* @param string $alias The alias of the class. 
* @param string $indexBy The index for the from. 
* 
* @return QueryBuilder This QueryBuilder instance. 
*/ 
public function from($from, $alias, $indexBy = null) 
{ 
    return $this->add('from', new Expr\From($from, $alias, $indexBy), true); 
} 
0

sólo tiene que utilizar el parámetro 3-rd de ->from(entity, alias, indexBy)

Así, en lugar

$qb->select('t.id, t.name')->from('Table', 't'); 

uso

$qb->select('t.id, t.name')->from('Table', 't', 'Table.id'); 

PS: @Francesc o-Casula escribió una buena respuesta con un poco más de detalles, bueno.

Cuestiones relacionadas