Autor Zpráva
Ikki
Profil
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
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?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0