Ver Mensaje Individual
  #17 (permalink)  
Antiguo 09/04/2012, 07:54
chemajmb
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Ordenando Repositories en Doctrine y otras dudas doctrine

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.

Última edición por chemajmb; 09/04/2012 a las 11:48