Buenas a todos,
Tengo algunos problemillas trabajando con Doctrine 2 y quiero pedir consejo.
El problema que tengo es que quiero ordenar un repositorio de entidades por un campo de una relacion.
Me explico mejor:
En la parte de gestion de mi proyecto tengo la parte de administracion de categorias de la tienda online.
Ahi hago un listado de categorias donde muestro varios campos:
padrecategoria->nombre, nombre, urlrelativa, descripcion, visible
Como podeis ver muestro el nombre de la categoria padre a traves de la relacion.
Ordenar por nombre, urlrelativa, descripcion o visible no es problema,
Código PHP:
public function findprueba(){
$query = $this->_em->createQuery("SELECT c FROM Entidad\Categoria c WHERE c.id > 1 ORDER BY c.nombre ASC");
return $query->getResult();
}
pero cuando quiero ordenar por el nombre de la categoria padre. La consulta se complica un poco mas. ( Tambien se puede hacer con un join )
Código PHP:
public function findprueba(){
$query = $this->_em->createQuery("SELECT c FROM Entidad\Categoria c, Entidad\Categoria p WHERE c.id > 1 AND c.padrecategoria = p ORDER BY p.nombre ASC");
return $query->getResult();
}
Ambas funciones me devuelven un vector de objetos entidad categoria.
Ahora bien me surgen varias preguntas relacionadas entre si.
1º.- ¿ Deberia devolver un vector de objetos mas simples en vez de un vector de entidades que es un tipo de datos mas pesado ?
Código PHP:
public function dameTodas(){
$query = $this->_em->createQuery( "SELECT p.nombre AS padrecategoria, c.nombre, c.urlrelativa, c.descripcion, c.visible FROM Entidad\Categoria c, Entidad\Categoria p
WHERE c.padrecategoria = p AND c.id > 1 AND c.activo = 1
ORDER BY p.nombre DESC, c.visible DESC" );
return arrayToObject($query->getResult());
}
Código:
object(stdClass)[144]
object(stdClass)[92]
public 'padrecategoria' => string 'Sección Roedores' (length=17)
public 'nombre' => string 'Pipas de calabaza' (length=17)
public 'urlrelativa' => string 'pipas-calabaza' (length=14)
public 'descripcion' => null
public 'visible' => boolean false
object(stdClass)[142]
public 'padrecategoria' => string 'Sección Reptiles' (length=17)
public 'nombre' => string 'Escamas' (length=7)
public 'urlrelativa' => string 'asdas' (length=5)
public 'descripcion' => string 'asdas' (length=5)
public 'visible' => boolean true
...
o asi
Código PHP:
public function damePrincipales(){
$query = $this->_em->createQuery("SELECT c FROM Entidad\Categoria c, Entidad\Categoria p
WHERE c.padrecategoria = p AND c.id > 1 AND c.activo = 1 AND p.id = 1
ORDER BY p.nombre ASC");
return $query->getresult();
}
Código:
array
0 =>
object(Entidad\Categoria)[141]
public 'id' => int 2
public 'padrecategoria' =>
object(DoctrineProxies\__CG__\Entidad\Categoria)[99]
private '_entityPersister' =>
object(Doctrine\ORM\Persisters\BasicEntityPersister)[93]
...
private '_identifier' =>
array
...
public '__isInitialized__' => boolean false
public 'id' => null
public 'padrecategoria' => null
public 'hijocategorias' =>
object(Entidad\Categoria)[176]
...
public 'productos' => null
public 'nombre' => null
public 'urlrelativa' => null
public 'descripcion' => null
public 'visible' => null
public 'activo' => null
public 'hijocategorias' =>
object(Doctrine\ORM\PersistentCollection)[150]
private 'snapshot' =>
array
...
private 'owner' =>
&object(Entidad\Categoria)[141]
private 'association' =>
array
...
private 'em' =>
object(Doctrine\ORM\EntityManager)[48]
...
private 'backRefFieldName' => string 'padrecategoria' (length=14)
private 'typeClass' =>
object(Doctrine\ORM\Mapping\ClassMetadata)[103]
...
private 'isDirty' => boolean false
private 'initialized' => boolean false
private 'coll' =>
object(Doctrine\Common\Collections\ArrayCollection)[153]
...
public 'productos' =>
object(Doctrine\ORM\PersistentCollection)[137]
private 'snapshot' =>
array
...
private 'owner' =>
&object(Entidad\Categoria)[141]
private 'association' =>
array
...
private 'em' =>
object(Doctrine\ORM\EntityManager)[48]
...
private 'backRefFieldName' => string 'categoria' (length=9)
private 'typeClass' =>
object(Doctrine\ORM\Mapping\ClassMetadata)[152]
...
private 'isDirty' => boolean false
private 'initialized' => boolean false
private 'coll' =>
object(Doctrine\Common\Collections\ArrayCollection)[136]
...
public 'nombre' => string 'Sección Perros' (length=15)
public 'urlrelativa' => string 'perros' (length=6)
public 'descripcion' => string 'AquÃ* puedes encontrar todo lo relacionado con el mundo de los perros.' (length=70)
public 'visible' => boolean false
public 'activo' => boolean true
1 =>
...
2º.- ¿ Que es mejor ? ¿ hacer la consulta con order by para traerte los datos ordenados o ordenar los datos una vez te los has traido ?
Claro, yo queria hacer una funcion dameOrdenadoPor( $orderby ) a la cual le paso un parametro para ordenar, pero como hemos visto, cuando tengo que ordenar por una relacion, la consulta se complica y transformar el paso de parametros a consulta también.
No es lo mismo pasar un array ( 'nombre' , 'DESC' ) para ordenar por el campo nombre, que tener que organizar por el campo nombre de la relacion con la categoria padre "padrecategoria". Hacer la consulta a partir del parametro en este caso es mas complicado, ademas la consulta cambia bastante.
Es por eso que quiero saber como se hace, consejos, pros y contras. Por que yo soy novato en esto pero estoy seguro que alguien sabra decirme como se suelen hacer estas cosas.
Un saludo.