Ver Mensaje Individual
  #10 (permalink)  
Antiguo 27/07/2011, 04:51
Avatar de bet7o
bet7o
 
Fecha de Ingreso: febrero-2010
Ubicación: DF
Mensajes: 315
Antigüedad: 14 años, 9 meses
Puntos: 20
De acuerdo Respuesta: Mostrar categorias con funcion recursiva

Cita:
Iniciado por vgonga1986 Ver Mensaje
Una autorelación, clave foranea referenciando a clave primaria de la misma tabla. Coincido con @Eleazan que sería lo suyo para este caso.

Un saludo y suerte.
De echo mi tabla es así como dicen, con una relación recursiva, pero no puedo ponerle 0 a las categorías padres porque las asociaciones no me lo permiten.

La categoria 0 no existe.

-------------------------------
categoria
-------------------------------
id
categoria_id
nombre
descripcion
-------------------------------

Ahora el codigo final es este.

Código PHP:
Ver original
  1. /**
  2.  
  3.    * Obtiene un arreglo con las categorias y su respectivo path.
  4.  
  5.    *
  6.  
  7.    *   Ej. categoria_1 > subcategoria_1 > subcategoria_1.1
  8.  
  9.    *
  10.  
  11.    * @param id $parent Id de la categoria padre.
  12.  
  13.    * @param string $nombre Nombre del path para la categoria hija.
  14.  
  15.    * @param string $blank Texto a mostrar en el primer option, si es nulo no genera el indice
  16.  
  17.    * @return array
  18.  
  19.    */
  20.  
  21.   public function treeCategory($parent = NULL, $nombre = NULL, $blank = NULL)
  22.  
  23.   {
  24.  
  25.     $conditions = Validate::isNull($parent) ? 'categoria_id IS NULL' : "categoria_id = $parent";
  26.  
  27.     $rs = $this->find("conditions: $conditions");
  28.  
  29.     if(!$rs) return;
  30.  
  31.     $path = array();
  32.  
  33.     if(!Validate::isNull($blank)) $path[''] = $blank;
  34.  
  35.     foreach($rs as $item)
  36.  
  37.     {
  38.  
  39.       $path[$item->id] = Validate::isNull($nombre) ? $item->nombre : "$nombre > $item->nombre";
  40.  
  41.       $childs = $this->treeCategory($item->id, $path[$item->id]);
  42.  
  43.       if(count($childs) > 0) foreach($childs as $k => $v) $path[$k] = $v;
  44.  
  45.     }
  46.  
  47.     return $path;
  48.  
  49.   }

Comparto tu opinion Uncontroled_Duck una categoría y una subcategoría al fin son categorías

Saludos!
__________________
Pero el no contaba con una cosa, mi peligroso desinteres por la vida humana