2011-12-13 20 views

Respuesta

4

Aquí hay una solución al utilizar QueryBuilder, mediante inyección manual del índice en la cláusula -

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

Esto parece funcionar para mí ...

+0

Me doy cuenta de que esta es una respuesta muy antigua, pero solo quisiera señalar que esto no funcionará para las consultas que no tienen ninguna cláusula WHERE. – rpkamp

-1

Sí, eso es posible, utilizando el generador de consultas. Un pequeño ejemplo, supongamos que queremos indexar por t.someField. Mira el tercer argumento desde el método.

<?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')); 
?> 

Esto debería funcionar en Doctrine 2.1 como mínimo. En Doctrine 2.0 aún no es compatible. En Doctrine 2.0 solo se admite cuando lo especifica con DQL.

+2

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

6

Para una actualización. Puedes hacer algo como esto.

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

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

Como resultado, la colección de arreglos contendrá los elementos correctamente indexados.

40

A partir de 2.2, ahora puede incluir INDEX BY en su declaración de. Si va a añadir una cláusula FROM,

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

Si ya tiene una cláusula FROM que desea reemplazar, entonces se puede sustituir con:

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

Hay una solicitud de extracción abierta para agregarlo a la función createQueryBuilder del Repositorio también, así que espero que esto se agregue pronto.

+6

Esta debería ser la respuesta correcta. – imclickingmaniac

+0

Hola, escribo desde 2015, y todavía no está allí :-( – zerkms

+0

Se rechazó ... https://github.com/doctrine/doctrine2/pull/592 – cmenning

0

También puede usar un INDICE POR predeterminado de una clave externa, p. "YourIndexValue_id" directamente en su asignación:

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

Por desgracia, no parece ser documentado que usted tiene que utilizar el nombre de la columna de la propia clave externa.

Working with Indexed Associations

2

La sintaxis correcta y la más simple sería:

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

Esto haría índice el resultado por el campo Nombre de la entidad.