Ver Mensaje Individual
  #19 (permalink)  
Antiguo 11/04/2012, 16:41
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

Busco buenas ideas

Estoy haciendo este proyecto

En el formulario cojo los filtros para el listado de la tabla y me gustaria saber como hacer el metodo para conseguir el repositorio con el que luego creo la tabla. Me refiero a si puedo hacer el metodo mas sencillo que como yo lo he hecho, mas reducido de codigo, de otra forma

Fijarse solamente en el metodo dameOrdenadoPor
Código PHP:
Ver original
  1. <?php
  2. namespace Repositorio;
  3.  
  4. use Doctrine\ORM\EntityRepository;
  5.  
  6. class categoriaRepositorio extends EntityRepository{
  7.    
  8.     public function damePrincipales(){
  9.         $query = $this->_em->createQuery("SELECT c.id, c.nombre FROM Entidad\Categoria c, Entidad\Categoria p
  10.                                            WHERE c.categoriapadre = p AND c.activo = 1 AND p.id = 1
  11.                                            ORDER BY p.nombre ASC");
  12.         return arrayToObject($query->getResult());
  13.     }
  14.     public function dameOrdenadoPor(array $whereparam = null, array $orderbyparam = null ){
  15.         $where = '';
  16.         $orderby = '';
  17.         if ( isset($whereparam) && !empty($whereparam) && is_array($whereparam) ){
  18.             foreach( $whereparam AS $akey => $avalue){
  19.                 if ( !( $avalue === '' ) && !( $avalue === null ) ){
  20.                     if ( $akey == 'categoriapadre')
  21.                         $where .= " AND p.id = $avalue";
  22.                     else
  23.                         $where .= " AND c.$akey LIKE '$avalue'";
  24.                 }
  25.             }
  26.         }
  27.         if ( isset($orderbyparam) && !empty($orderbyparam) && is_array($orderbyparam) && ( count($orderbyparam) == 2 ) )
  28.             $orderby = "ORDER BY $orderbyparam[0] $orderbyparam[1]";
  29.         $query = $this->_em->createQuery( "SELECT p.nombre AS categoriapadre, c.id, c.nombre AS nombre, c.urlrelativa AS urlrelativa, c.descripcion AS descripcion, c.visible AS visible FROM Entidad\Categoria c, Entidad\Categoria p
  30.                                            WHERE c.categoriapadre = p AND c.id > 1 AND c.activo = 1$where
  31.                                            $orderby" );
  32.         //var_dump($query);
  33.         return arrayToObject($query->getResult());
  34.     }
  35.  
  36. }
  37.  
  38. ?>

Lo que quiero saber es como hacer metodos mas genericos que me sirvan para todos mis repositorios para transformar los parametros del $whereparam que le paso al metodo a la parte de la consulta de WHERE ... y lo mismo para el $orderby ORDER BY.
Me gustaria hacer metodos genéricos para transformar los parametros en sentencias string para el where y el order by de todos mis repositorios. Hacerlo en un repositorio base y que luego todos los repositorios desciendan de este y los hereden. Bueno, no se si se puede hacer, me gustaria alguien me aconsejara.
Tambien me gustaria
Pero fijaros en el dilema que me encuentro. Pues no es lo mismo filtrar por la categoria padre recogida en el formulario, que contiene la id de la relacion categoriapadre de la entidad. Es decir, no es lo mismo filtrar por categoriapadre->id que por el nombre de la categoria.
Código PHP:
Ver original
  1. if ( $akey == 'categoriapadre')
  2.                         $where .= " AND p.id = $avalue";
  3.                     else
  4.                         $where .= " AND c.$akey LIKE '$avalue'";

Creo que no podre simplificarlo ni hacerlo generico, pues en cada tabla puedo listar variados datos provenientes tanto de campos de relaciones con otras tablas, con lo que en cada repositorio de cada entidad tendre que implementarlo, pues va a depender siempre de lo que quiera en la tabla y eso como digo puede variar mucho.

La cosa es que estoy hecho un lio, y simplemente quiero mostrar como lo hago yo, para que la gente que lleva tiempo en esto, me de sus ideas de como suele hacer esto, pues yo acabo de empezar y seguro que hay gente que esto lo tiene trilladisimo, que le ha dado ya 400 mil vueltas.

Saludos.

Última edición por chemajmb; 11/04/2012 a las 16:51