Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny] Phalcon - pobranie rekordów wraz z powiazanymi rekordami
skorpionek93
post 16.04.2016, 19:12:20
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.04.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował skorpionek93 16.04.2016, 19:35:29
Go to the top of the page
+Quote Post
phpion
post 20.04.2016, 11:32:58
Post #2





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
skorpionek93
post 23.04.2016, 16:59:10
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.04.2014

Ostrzeżenie: (0%)
-----


Dziękuję bardzo za pomoc. Na tej podstawie napisałem działajacą funkcję rekurencyjną (z drobnymi zmianami).
Pozdrawiam serdecznie
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 03:11