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']));
                    
                
            }
        }
    }