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); // return $result; //return $this->t['data']; } private function getSubCatsConnects($cid){ // $result['data'] = $this->data_ar; foreach ($this->data_ar as $data){ $this->t = $this->getChildCat($data); foreach($this->t['data'] as $data2){ } } } private function checkChildsExists(){ $flag = false; foreach($this->data_ar as $d){ $q = $this->getChildCat($data); if($q['count'] > 0){ } } }