2011-12-13 18 views

risposta

4

Ecco un'unica soluzione quando si utilizza QueryBuilder, con iniezione manuale dell'indice dalla clausola -

(do you querybuilder statement) 
$q = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL())); 

Questo sembra funzionare per me ...

+0

Mi rendo conto che questa è una risposta molto vecchia, ma io vorrei solo sottolineare che questo non funzionerà per le query che non hanno alcuna clausola WHERE. – rpkamp

-1

Sì, è possibile, utilizzando il generatore di query. Un piccolo esempio, supponiamo di voler indicizzare con t.someField. Guarda il terzo argomento in dal metodo.

<?php 
$query = $em->createQueryBuilder() 
    ->select('t.somefield', 't.someOtherField') 
    ->setFrom('Entity\Table', 't', 't.someField') 
    ->getQuery() 
$results = $query->getArrayResult(); 

//your result will look something like: 
$results['somefieldvalue'] = array(array('somefield' => 'value', 'someOtherField' => 'test')); 
?> 

Questo dovrebbe funzionare in Doctrine 2.1 almeno. In Doctrine 2.0 non è ancora supportato. In Doctrine 2.0 è supportato solo quando lo si specifica con DQL.

+2

Con Doctrine 2.1.0-DEV, utilizzo '$ qb-> add ('from', 'Entity \ Table t INDEX BY t.id');' – Maxence

6

Per un aggiornamento. Puoi fare qualcosa di simile.

$qb = $entityManager->createQueryBuilder(); 
$qb->from($repository->getClassName(), 'a', 'a.id'); 
$qb->select(a); 

$result = new ArrayCollection($qb->getQuery()->getResult()); 

Di conseguenza, la raccolta di array conterrà correttamente gli elementi indicizzati.

40

A partire da 2.2, è ora possibile includere INDICE BY nella propria istruzione from. Se si sta aggiungendo una clausola from,

$qb->from($class, $alias, $indexBy); 

Se si dispone già di una clausola FROM che si desidera sostituire, quindi è possibile sostituirlo con:

$qb->add('from', new Expr\From($class, $alias, $indexBy), false); 

C'è una richiesta di pull aperta per aggiungerlo anche alla funzione createQueryBuilder del repository, quindi speriamo che questo venga presto aggiunto.

+6

Questa dovrebbe essere la risposta corretta. – imclickingmaniac

+0

Ehi, sto scrivendo dal 2015, e non c'è ancora :-( – zerkms

+0

E 'stato rifiutato ... https://github.com/doctrine/doctrine2/pull/592 – cmenning

0

È inoltre possibile utilizzare un INDICE DI BY predefinito di una chiave esterna, ad es. "YourIndexValue_id" direttamente nella tua mappatura:

/** 
* @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id") 
*/ 
protected $bars; 

Purtroppo non sembra essere documentato che si deve utilizzare il nome della colonna della chiave esterna in sé.

Working with Indexed Associations

2

La sintassi corretta e la più semplice sarebbe:

$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult(); 

Questo sarebbe indice il risultato per campo Nome entità.