2012-07-04 15 views
13

Czy można zmienić wartości klucza tablicy dla getResult() w Doctrine2?Zmiana klucza tablicy getResult dla wartości klucza podstawowego

Przykład:

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

Kiedy drukować to, mam, co nie jest to, co chciałem:

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

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

Co chcę jest:

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

Sugestie, wskazówki byłyby mile widziane.

Odpowiedz

31

jestem naprawdę bardzo zadowolony, jak fajne to jest to:

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

Indeksu przez konstrukt ma nic, co bezpośrednio przekłada się na SQL ale wpływa obiektów i tablicy nawilżenie. Po każdej klauzuli FROM i JOIN należy określić, w jakim polu ta klasa powinna być indeksowana w wyniku . Domyślnie wynik jest zwiększany za pomocą klawiszy numerycznych, począwszy od z 0. Jednak w przypadku INDEX BY można podać dowolną inną kolumnę, która ma być kluczem do wyniku, ma to jednak sens tylko w przypadku pierwotnych lub unikatowych pól.

Źródło: Doctrine ORM 2 Documentation Using INDEX BY

  • Proszę używać indeksu, przed GDZIE
+0

Ekscytujące podejście, ale nie działa z MySql 5.6.16. Czy to powinno być? –

+2

@ MatthewT.Baker To nie jest SQL, to jest DQL i jak wspomniano, nie jest tłumaczone na nic w wynikowym zapytaniu SQL. – Omn

14

Jednakże, ze względu na kompletność, można zrobić to samo z konstruktora zapytań, jak pokazano poniżej:

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

Jak widać indeks przez opcja jest dostępna jako trzeci parametr konstruktora zapytań from metoda:

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

Wystarczy skorzystać z 3-rd parametr ->from(entity, alias, indexBy)

Tak więc, zamiast

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

użycie

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

PS: @Francesc o-Casula napisał dobrą odpowiedź z mniejszymi szczegółami.

Powiązane problemy