Hola como te va, hace poco me meti en un lio con las categorias, tenia una estructura similar a la que usas,
tabla categorias
Cita: id
categoria_id // padre
nombre
luego tengo una tabla de asignacion de categorias
tabla categorias_post
y una tabla post
En mi caso podia tener post asignados para la categoria padre sin depender que tuviera hijos, y se me complicaba cuando necesitaba mostrar al padre si alguno de sus hijos tenian asignado post.
Despues de varios dias lo pude solucionar asi que pongo lo que utilice quizas no sea lo mismo que tenes que hacer vos pero algo te puede orientar.
Código php:
Ver originalfunction getPostByCategoriaId($catId){
global $DbConn;
$sql = 'SELECT post_id, titulo FROM categorias_post AS tcat
LEFT JOIN categorias AS tc ON tcat.categoria_id = tc.id
LEFT JOIN post AS tp ON tcat.post_id = tp.id
WHERE tcat.categoria_id ='.$catId ;
$res = $DbConn->query($sql);
$i = 0;
while($row = $DbConn->fetchAssoc($res)){
$data[$i]=$row;
$i++;
}
return $data;
}
function getNumPostByCategoria($idCategoria){
global $DbConn;
$sql = 'SELECT COUNT(p.id) AS NUM FROM post p
LEFT JOIN categorias_post cp ON p.id = cp.post_id
WHERE cp.categoria_id = '.$idCategoria;
$resul = $DbConn->fetchArray($DbConn->query($sql));
return $resul['NUM'];
}
function getNumHijosByCategoria($idCategoria){
global $DbConn;
$sql = 'SELECT COUNT(id) AS NUM FROM categorias WHERE categoria_id ='.$idCategoria;
$resul = $DbConn->fetchArray($DbConn->query($sql));
return $resul['NUM'];
}
function crearArboles($parent='0',$ini){
global $DbConn;
//buscamos las categorias con el parent
$sql = 'SELECT * FROM categorias WHERE categoria_id ='.$parent;
$res = $DbConn->query($sql);
$numR = $DbConn->numRows($res);
while($arr = $DbConn->fetchArray($res)){
//comenzamos a recorrer una por una, primero vamos a comprobar si tiene post
$arrRet[$ini]['id'] = $arr['id'];
$arrRet[$ini]['categoria'] = $arr['Nombre'];
if($this->getNumPostByCategoria($arr['id'])>0){
$arrRet[$ini]['post'] = $this->getPostByCategoriaId($arr['id']);
}
if($this->getNumHijosByCategoria($arr['id'])>0){
$arrRet[$ini]['hijo'] = $this->crearArboles($arr['id'],$ini);
}
$ini++;
}
return $arrRet;
}
esto me devuelve un array asi
despues utilizo una funcion para recorrer y mostrar el array cocultando con javascript las subcategorias:
Código php:
Ver originalfunction recorrer($array){
foreach($array as $num => $padre){
$mTitulo = false;
// si tiene post
if(!empty($padre['post'])){ $mTitulo = true;
}
// si tiene hijos
if(!empty($padre['hijo'])){ //buscamos que tengan post, en el caso de tener hijos volveria a hacer la recursiva
//y al cumplir la condicion retornaria el dato
foreach($padre['hijo'] as $num => $hijo){
// si tiene un post debe mostrar el titulo del padre
if(!empty($hijo['post'])){ $mTitulo = true;
}else{
if(!empty($hijo['hijo'])){ recorrer($hijo['hijo']);
}
}
}
}
if($mTitulo){
$html .= '
<li class="closed"><span class="folder">'.$padre['categoria'].'</span>
<ul>';
//recorremos los datos del post
foreach($padre['post'] as $num => $post){
$html .= '
<li><span class="file"><a href="'.ROOT_PATH.'/post/ver/id/'.$post['post_id'].'"> '.$post['titulo'].'</a></span></li>';
}
// verificamos si tiene hijos
if(!empty($padre['hijo'])){ $html .= recorrer($padre['hijo']);
}
$html .= ' </ul>
</li>';
}else{
$html .= '';
}
}
return $html;
}