related přes více tabulek?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
motorcb
Člen | 552
+
0
-

Představme si následující databázi:

CREATE TABLE `kategorie` (
  `id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
  `nazev` VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `clanky` (
  `id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
  `kategorie_id` INTEGER NOT NULL,
  `titulek` VARCHAR(100) NULL DEFAULT NULL,
  `text` MEDIUMTEXT NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `komentare` (
  `id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
  `clanek_id` INTEGER NOT NULL,
  `text` MEDIUMTEXT NOT NULL,
  PRIMARY KEY (`id`)
);

-- ---
-- Foreign Keys
-- ---
ALTER TABLE `clanky` ADD FOREIGN KEY (kategorie_id) REFERENCES `kategorie` (`id`);
ALTER TABLE `komentare` ADD FOREIGN KEY (clanek_id) REFERENCES `clanky` (`id`);

Chtěl bych vypsat všechny kategorie a články. A zároveň vypsat počet komentářů v kategorii a počet komentářů v článku.
Jen se mi nedaří zjistit celkový počet komentářů pro kategorii. Je možné udělat related přes více tabulek???

{foreach $database->table('kategorie') as $kategorie}

    {$kategorie->nazev} : TODO ??? POČET KOMENTÁŘŮ V KATEGORII ??? TODO <br/>

    {foreach $kategorie->related('clanky') as $clanek}
        - {$clanek->titulek} : {$clanek->related('komentare')->count("*")}<br/>
    {/foreach}

{/foreach}
vvoody
Člen | 910
+
0
-
{foreach $database->table('kategorie') as $kategorie}

    {$kategorie->nazev} : {$connection->table('komentare')->where('clanek_id',$kategorie->related('clanky')->select('id'))->count('*')} <br/>

    {foreach $kategorie->related('clanky') as $clanek}
        - {$clanek->titulek} : {$clanek->related('komentare')->count("*")}<br/>
    {/foreach}

{/foreach}

V kazdej iteracii nad kategoriami potrebujes novy selection nad komentarmi, preto treba ten connection (mozno by to slo aj inak riesit), ale nedam ruku do ohna za to ze to bude fungovat ;)

motorcb
Člen | 552
+
0
-

vvoody:
Dobře ty, to se pozná kapacita :) Máš u mne tuplovaný pivo :)

nanuqcz
Člen | 822
+
0
-

No nevim, mě se řešení „použít v šabloně $connection“ moc nelíbí. Ale nic lepšího mě taky nenapadlo. Čisté to ale zaručeně není…

vvoody
Člen | 910
+
0
-

Napodobne. Len tak na zamyslenie, bolo by cistejsie si tam vlozit uz len samotny selection a pri kazdej iteracii pouzivat jeho klon? Fakt nema selection nejaky mechanizmus, ktory ho akoby vynuluje?

Edit: pripadne si spravit taky minimodel, ktory by riesil tuto funkcionalitu a obsahoval connection ako private property. Ten by som do sablony nacpat uz nemal problem.

Editoval vvoody (4. 7. 2012 10:35)

hrach
Člen | 1838
+
0
-

a co toto?

{$kategorie->nazev} : {$kategorie->count('clanky.komentare.id')}
nanuqcz
Člen | 822
+
0
-

hrach: Jo, to mě asi na půl sekundy napadlo, ale pak jsem si řekl že tohle určitě nebude fungovat, že to bych chtěl po NDB už moc :-D Takže super, díky :-)