Witam,
Szczerze przyznając nie bardzo wiem jak poprawnie zapisać warunek dla rekurencji drzewka kategorii.
W bazie mamy 2 tabele:
- Category [id] [m_id] [name] [desc]
- Elements [id] [c_id] [...]
Jeśli kategoria jest na pierwszym poziomie menu -> [m_id] = NULL, subkategorie zawsze zawierają w [m_id] id kategorii matki.
Docelowo chciałbym, aby pod nazwą danej kategorii wyświetlić ilość elementów, które zawiera, a także zostawić możliwość odnoszenia się do pojedyńczych dlatego pomyślałem o wrzuceniu do tablicy wszystkich id danej kategorii, które znalazło.
Problem w tym, że znajduje mi elementy poprawnie tylko 1 poziom niżej, a do tego ćwiczenia chciałbym napisać dowolną głębokość poziomów.
Jako, że jestem w trakcie nauki, staram się pisać metody tak by był jak najbardziej uniwersalny do zmiany i już szczerze mówiąc koncentracja całkiem wybiła się z tropu..
W tym momencie kod zlicza i pokazuje ilość subkategorii wewnątrz każdej, ale jak wspomniałem nie uwzględnia tych, które są od kolejnego poziomu.
Jak zapisać warunek rekurencji by uzyskać taki efekt?
public function getAllCat(){
$this->db->query("SELECT * FROM category ORDER BY id ASC");
$result = $this->db->resultSet();
return $result;
}
// Pobieramy dane i ilość elementów z kategorii
public function getChildCat($id){
$this->db->query("SELECT * FROM category WHERE m_id = :id");
$this->db->bind(':id',$id);
$result['data'] = $this->db->resultSet();
$result['count'] = $this->db->rowCount();
return $result;
}
// Pobieramy dane elementów, które znajdują się w danej kategorii
public function elementsCountByCatId($id){
$this->db->query("SELECT * FROM elements WHERE c_id = :id");
$this->db->bind(':id',$id);
$result['data'] = $this->db->resultSet();
$result['count'] = $this->db->rowCount();
return $result;
}
/*
* Pobieramy ilość elementów, którą zawiera łącznie z subkategoriami
* @params (int) $cat_id ID kategorii
*/
public function getSubCatsElements($cid = null){
// Sprawdzamy czy podano ID konkretnej kategorii
if($cid == null){
return false;
}
$this->data_ar = [];
$this->getSubCatsConnects($cid);
// print_r($this->data_ar);
print_r($this->t['count']);
// return $result;
//return $this->t['data'];
}
private function getSubCatsConnects($cid){
array_push($this->data_ar, $cid);
// $result['data'] = $this->data_ar;
foreach ($this->data_ar as $data){
$this->t = $this->getChildCat($data);
foreach($this->t['data'] as $data2){
array_push($this->data_ar, $data2->id);
}
}
}
private function checkChildsExists(){
$flag = false;
foreach($this->data_ar as $d){
$q = $this->getChildCat($data);
if($q['count'] > 0){
print_r(array_diff($this->data_ar, $q['data']['id']));
}
}
}