Você pode usar
JOIN's na
query para obter todas as categorias e subcategorias.
Por exemplo, se sua tabela se chama
cat e o nível de subcategorias é 2 (é possível ter categoria, subcategoria e "subsubcategoria"), então você tem que usar dois
JOIN's na
query:
SELECT `c1`.`nome_cat` AS `n1` , `c2`.`nome_cat` AS `n2` , `c3`.`nome_cat` AS `n3`
FROM `cat` AS `c1`
LEFT JOIN `cat` AS `c2` ON `c1`.`idCat` = `c2`.`id_pai`
LEFT JOIN `cat` AS `c3` ON `c2`.`idCat` = `c3`.`id_pai`
WHERE `c1`.`id_pai` = 0
Agora com o PHP você trata os resultados da maneira que quiser.
Supondo que o
array de objectos contendo o resultado da
query mostrada acima é definido na variável
$result, você pode imprimir a lista de categorias no formato:
Cat 1
--Sub Cat 1.1
----Sub Cat 1.1.1
----Sub Cat 1.1.2
----Sub Cat 1.1.3
--Sub Cat 1.2
--Sub Cat 1.3
--Sub Cat 1.4
--Sub Cat 1.5
Cat 2
--Sub Cat 2.1
--Sub Cat 2.2
Cat 3
usando o seguinte código:
$cat = '';
$subcat = '';
foreach($result as $row)
{
if($cat == $row->n1 AND $row->n2 != NULL)
{
if($subcat == $row->n2 AND $row->n3 != NULL)
{
print_cat($row->n3, 2);
}
elseif($subcat != $row->n2)
{
$subcat = $row->n2;
print_cat($row->n2, 1);
if($row->n3 != NULL)
print_cat($row->n3, 2);
}
}
elseif($cat != $row->n1)
{
$cat = $row->n1;
$subcat = '';
print_cat($cat, 0);
if($row->n2 != NULL)
{
$subcat = $row->n2;
print_cat($subcat, 1);
if($row->n3 != NULL)
print_cat($row->n3, 2);
}
}
}
em que
print_cat é:
function print_cat($name, $level)
{
for($i = 0; $i < $level; $i++)
echo '-';
echo $name . '<br />';
}
Deu para entender algo!?
Note que o código acima ainda pode ser melhorado. Esta foi uma solução rápida de resolver o problema.
Abraços