Autor | Zpráva | ||
---|---|---|---|
Ikki Profil |
#1 · Zasláno: 23. 2. 2019, 21:11:04
Zdravím,
aktuálně řeším takové dilema kdy potřebuji vytvořit několik tabulek pro výpis kategorií a subkategorií (něco jako je na fóru). Model: public function getCategories() { $query = $this->pdo->prepare("SELECT c.*, sc.name AS catname, sc.label AS catlabel FROM f_categories c INNER JOIN f_subCategories sc ON c.id = sc.category_id ORDER BY sc.id"); if($query->execute()) { return $query->fetchAll(); } else { return false; } } View: <?php foreach($categories as $category): ?> <div class="panel-group" id="accordion_forum1"> <div class="panel panel-default"> <a class="panel-default" data-toggle="collapse" data-parent="#accordion_forum1" href="#forum1"> <div class="panel-heading"> <i class="fa fa-folder-open-o fa-fw"></i> <strong><?php echo $category['name'];?></strong> <span class="pull-right"><i class="fa fa-compress"></i></span> </div> </a> <div id="forum1" class="panel-collapse collapse in"> <div class="panel-body"> <div class="hidden-xs"><em><?php echo $category['label'];?></em></div> </div> <table class="table table-hover"> <thead> <tr> <th class="hidden-xs"></th> <th class="hidden-xs"></th> <th>Název fóra</th> <th class="text-right">Témat</th> <th class="text-right">Příspěvků</th> <th class="hidden-xs">Poslední příspěvek</th> </tr> </thead> <tbody> <?php //foreach($category as $subcategory):?> <tr> <!-- Forum Icon Based On Forum ID --> <td class="hidden-xs"> <div class="show-forum-icon show"> <img src="https://www.eebootstrap.com/themes/forum_themes/eebootstrap/images/forum_icons/forum_icon_2.png" alt="forum icon 10"> </div> </td> <td class="hidden-xs topic-marker-forum"> <i class="fa fa-bell-o"></i> </td> <td class="col-md-6 col-sm-6"> <div><a href="https://www.eebootstrap.com/forum/viewforum/10/" title="Test Messages"><strong><?php echo $category['catname'];?></strong></a></div> <div class="hidden-xs"><?php echo $category['catlabel'];?></div> </td> <td class="col-md-1 col-sm-1 text-right"><span class="badge">10</span></td> <td class="col-md-1 col-sm-1 text-right"><span class="badge">16</span></td> <td class="col-md-4 col-sm-4 hidden-xs"> <div> <a href="https://www.eebootstrap.com/forum/viewthread/54/">Thread with SoundCloud Track embedded</a><br> <i class="fa fa-clock-o"></i> 12-11-2014 08:23<br> <i class="fa fa-user"></i> <a href="https://www.eebootstrap.com/forum/member/1/">eeBootstrap Support Team</a> </div> </td> </tr> <?php //endforeach; ?> </tbody><tbody> </tbody></table> </div> </div> </div><!-- General --> <?php endforeach; ?> Ve chvíli kdy mám pouze pro každou kategorii jednu subkategorii tak to funguje, jenže ve chvíli kdy přidám do nějaké kategorie (c) další subkategorie (sc) tak se mi vytvoří další tabulka s danou kategorií a pouze s danou subkategorií. Výsledek tedy vypadá nějak takto: Kategorie1 Subkategorie(pro kategorii 1) Kategorie2 Subkategorie(pro kategorii 2 [1]) //Subkategorie(pro kategorii 2[2]) <- TOHOTO POTŘEBUJI DOSÁHNOUT Kategorie2 Subkategorie(pro kategorii 2 [2]) <- A TOHOTO SE ZBAVIT |
||
Kajman Profil |
Udělejte si jednu jedinou tabulku pro celý strom.
id_kategorie, nazev, id_nadrazene_kategorie, poradi Pokud to máte na staré mysql, co neumí rekurzivní dotazy, přidejte si sloupce lft, rgt, level pro traverzování kolem stromu. |
||
Ikki Profil |
Také mě to napadlo, jen mi to přišlo příliš nepřehledné, ale asi to tímhle stylem nepůjde, že?
No a jak to v takovém případě řešit? Přes jeden foreach, nebo vícero? MySQL využívám aktuální, snad tu nejnovější. |
||
Kajman Profil |
#4 · Zasláno: 23. 2. 2019, 22:55:25
Ono asi hodně záleží na struktuře html kódu, který chcete vygenerovat pro neomezené zanoření. Podle toho je pak možné upravit dotaz a zpracování.
Když se vypisují všechny kategorie, je možné si dát všechny řádky do php pole podle rodiče a to vypisovat rekurzivní funkcí v php, čímž se to zanoří i v html. Na to není rekurze v sql úplně potřeba (ale hodí se pro jiné typy dotazů). Můžete si zkusit nějaký příklad z toho odkazu, ať vyzkoušíte podporu rekurze v dotazech. WITH RECURSIVE fibonacci (n, fib_n, next_fib_n) AS ( SELECT 1, 0, 1 UNION ALL SELECT n + 1, next_fib_n, fib_n + next_fib_n FROM fibonacci WHERE n < 10 ) SELECT * FROM fibonacci; Případně SELECT Version() |
||
Ikki Profil |
HTML kód jsem taky zaslal.
Pokusil jsem se zavolat funkci v html kódu jenže tam je problém a nejde vyvolat jinak než z controlleru a tak nejsem schopen tam vložit ID kategorie abych pod ní vypisoval subkategorie. Když to ponechám takhle a pouze převedu tabulky do jedné, tak se mi sice vypíší kategorie v pořádku, ale vypíší se mi všechny subkategorie v kategoriích i ty které tam nepatří. Tedy se ptám na jednu a tu nejdůležitější věc, tedy řešení - jak dostat ID kategorie do následujícího SQL dotazu pro vypsání subkategorií k dané kategorii. Je nějak možné dostat hodnotu z foreach do controlleru, nebo nějak vyvolat funkci v phtml souboru ve view? |
||
Časová prodleva: 6 let
|
0