Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny] Phalcon - pobranie rekordów wraz z powiazanymi rekordami
Forum PHP.pl > Forum > PHP > Frameworki
skorpionek93
Witam.
W dużym skrócie potrzebuję pobrać rekordy (które mają parentID = NULL) a potem rekordy potomne i ich rekordy potomne i tak dalej. Problem w tym, że ilość powiązań jest nieograniczona. W tym przypadku chodzi o kategorie. Może najpierw kod. Struktura mojej bazy wygląda tak:
  1. CREATE TABLE IF NOT EXISTS `ShopCategory` (
  2. `ID` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL,
  4. `slug` varchar(255) NOT NULL,
  5. `parentID` int(11) UNSIGNED DEFAULT NULL,
  6. `description` text,
  7. `status` tinyint(1) NOT NULL DEFAULT '0',
  8. PRIMARY KEY (`ID`),
  9. KEY `parentID` (`parentID`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Przykład:


Model:

  1. ...
  2.  
  3. public function initialize()
  4. {
  5. $this->setSource("ShopCategory");
  6. $this->hasMany('ID', 'ShopCategory', 'parentID', array('alias' => 'categories'));
  7. $this->belongsTo('parentID', 'ShopCategory', 'ID', array('alias' => 'ShopCategory'));
  8. }
  9.  
  10. ...
  11.  


I pracuję nad funkcją, która pobierze wszystkie rekordy w odpowiedniej kolejności (tzn. rekord główny (parentID = NULL), potem jego rekordy potomne i ich rekordy potomne, aby w końcu powstało coś takiego:

  1. <ul>
  2. <li>Procesory
  3. <ul>
  4. <li>AMD</li>
  5. <li>Intel
  6. <ul>
  7. <li>i7</li>
  8. </ul>
  9. </li>
  10. </ul>
  11. </li>
  12. </ul>



Cały dzień nad tym myslę, kombinuję i nic... Wielu rozwiazań próbowałem (włącznie z zapisywaniem wszystkich rekordów do tablic i próbą ich sortowania) ale nic z tego nie wychodzi...
Problem jest w tym, że ilość zagnieżdżeń jest dowolna (gdyby tak nie było to wrzuciłbym pętlę for te X razy i by było).
Będę bardzo wdzieczny za pomoc.
Pozdrawiam
phpion
Nie podam Ci rozwiązania typowo dla Phalcona, ale ogólne. Pobierasz rekordy posortowane w odpowiedni sposób (tak jak chcesz by widniały w drzewku), np. po nazwie:
  1. SELECT * FROM ShopCategory ORDER BY name ASC

Następnie w PHP robisz tablicę, gdzie kluczem jest ID kategorii nadrzędnej (dla NULL wstawiasz 0), a wartościami jej dzieci:
Kod
$tree = array(
    0 => array(
        array('id' => 1, 'name' => 'Procesory')
    ),
    1 => array(
        array('id' => 2, 'name' => 'AMD'),
        array('id' => 3, 'name' => 'Intel')
    ),
    3 => array(
        array('id' => 5, 'name' => 'i7')
    )
);

Teraz piszesz funkcję, która wyświetli Ci drzewko (dla danego parent_id) oraz ewentualnie rekurencyjnie elementy podrzędne, coś w stylu:
1. Jako parametr przekazujesz całe drzewo oraz aktualne parent_id (domyślnie 0).
2. Jeśli istnieje klucz $tree[$parent_id] to lecisz po jego elementach ($item).
3. Jeśli istnieje klucz $tree[$item['id']] czyli element ma swoich potomków to wykonujesz tą samą funkcję, ale z drugim parametrem $item['id'].

Tyle. Kwestia odpowiedniego ulokowania <ul> oraz <li> i masz ładne drzewko. Rozwiązanie stosowałem w wielu projektach. Drzewko trzymałem w cache, do tego miałem dodatkowe funkcje jak np. pobranie ścieżki do kategorii czy ID wszystkich potomków.
skorpionek93
Dziękuję bardzo za pomoc. Na tej podstawie napisałem działajacą funkcję rekurencyjną (z drobnymi zmianami).
Pozdrawiam serdecznie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.