2012-07-04 8 views
13

È possibile modificare i valori della chiave dell'array per getResult() in Doctrine2?Modificare la chiave dell'array getResult per il valore della chiave primaria

Esempio:

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

Quando stampo questo, ottengo, che non è quello che volevo:

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

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

Quello che voglio è:

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

Suggerimenti, suggerimenti sarebbero apprezzati.

risposta

31

In realtà sono molto contento di quanto freddo questa cosa è:

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

L'INDICE PER costrutto è nulla che si traduce direttamente in SQL ma che influenza oggetto e la matrice idratazione. Dopo ciascuna clausola FROM e JOIN si specifica in quale campo questa classe deve essere indicizzata nel risultato . Per impostazione predefinita, un risultato viene incrementato con i tasti numerici che iniziano con con 0. Tuttavia con INDICE BY è possibile specificare qualsiasi altra colonna come la chiave del risultato, ma ha senso solo con i campi primari o esclusivi.

Fonte: Doctrine ORM 2 Documentation Using INDEX BY

  • Si prega di utilizzare INDEX BY prima DOVE
+0

Approccio eccitante ma non sembra funzionare con MySql 5.6.16. Dovrebbe? –

+2

@ MatthewT.Baker Non è SQL, è DQL e come detto, non si traduce in nulla nella query SQL risultante. – Omn

14

Tuttavia, per ragioni di completezza, si può fare lo stesso con il generatore di query come illustrato di seguito:

$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() 
); 

Come si può vedere l'indice da opzione è disponibile come terzo parametro del generatore di query from metodo:

/** 
* 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

Basta usare il parametro 3-rd del ->from(entity, alias, indexBy)

Così, invece

$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 ha scritto una buona risposta con pochi altri dettagli, beh.

Problemi correlati