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?


  1. public function getAllCat(){
  2. $this->db->query("SELECT * FROM category ORDER BY id ASC");
  3. $result = $this->db->resultSet();
  4. return $result;
  5. }
  6.  
  7. // Pobieramy dane i ilość elementów z kategorii
  8. public function getChildCat($id){
  9. $this->db->query("SELECT * FROM category WHERE m_id = :id");
  10. $this->db->bind(':id',$id);
  11. $result['data'] = $this->db->resultSet();
  12. $result['count'] = $this->db->rowCount();
  13. return $result;
  14. }
  15.  
  16. // Pobieramy dane elementów, które znajdują się w danej kategorii
  17. public function elementsCountByCatId($id){
  18. $this->db->query("SELECT * FROM elements WHERE c_id = :id");
  19. $this->db->bind(':id',$id);
  20. $result['data'] = $this->db->resultSet();
  21. $result['count'] = $this->db->rowCount();
  22.  
  23. return $result;
  24. }
  25.  
  26. /*
  27.   * Pobieramy ilość elementów, którą zawiera łącznie z subkategoriami
  28.   * @params (int) $cat_id ID kategorii
  29.   */
  30. public function getSubCatsElements($cid = null){
  31. // Sprawdzamy czy podano ID konkretnej kategorii
  32. if($cid == null){
  33. return false;
  34. }
  35. $this->data_ar = [];
  36.  
  37. $this->getSubCatsConnects($cid);
  38. // print_r($this->data_ar);
  39. print_r($this->t['count']);
  40. // return $result;
  41. //return $this->t['data'];
  42. }
  43.  
  44. private function getSubCatsConnects($cid){
  45. array_push($this->data_ar, $cid);
  46. // $result['data'] = $this->data_ar;
  47. foreach ($this->data_ar as $data){
  48. $this->t = $this->getChildCat($data);
  49. foreach($this->t['data'] as $data2){
  50. array_push($this->data_ar, $data2->id);
  51. }
  52. }
  53. }
  54.  
  55. private function checkChildsExists(){
  56. $flag = false;
  57. foreach($this->data_ar as $d){
  58. $q = $this->getChildCat($data);
  59. if($q['count'] > 0){
  60. print_r(array_diff($this->data_ar, $q['data']['id']));
  61.  
  62.  
  63. }
  64. }
  65. }