Question:
Consider the following table configuraciones
id | nombre | valor | categoria
-----------------------------------------------
1 | color | azul | personal
2 | día | martes | personal
3 | ciudad | Limón | general
Suppose there are many more configurations classified by category. I have tried to run a query that allows me to get those settings:
$q = Doctrine_Query::create()
->from('Configuracion c')
->where('c.categoria = ?', $categoria);
Everything works great up to this point. But is there a way to create a query that will return a sorted structure in categories? For example:
$resultado = $q->execute();
//la idea acá es usar la columna "nombre" como índice:
$color = $resulSet['color']
//imprimir el valor de color:
echo $color['valor']; //debería imprimir "azul"
Answer:
The trick is to use the INDEX BY
argument.
Query class
The following example illustrates a statement using the Doctrine Query Language :
$consulta = $em->createQuery('
SELECT c
FROM modelos\Configuracion c
INDEX BY c.nombre
WHERE c.category = :category');
$consulta->setParameter('category', 'personal');
We specify the type of result as an Array
to be able to manipulate it by indexes:
$configuraciones = $consulta->getResult(Query::HYDRATE_ARRAY);
We show the value:
echo $settings['color']['valor']; // imprime "azul"
QueryBuilder
Example using theQueryBuilder object:
$consulta = $em->createQueryBuilder();
$consulta->select('c');
// el tercer argumento indica el índice del eventual resultado
$consulta->from('modelos\Configuracion', 'c', 'c.nombre');
$configuraciones = $consulta->getQuery()->getResult();
Now the value is only accessed through the object's functions:
$color = $configuraciones['color'];
$valor = $color->getValor(); // devuelve "azul"