Primitivní INNER JOIN dvou tabulek 1:n

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

Zdravím, v první řadě se omlouvám, že zakládám další diskusi na toto téma, ale ani po projítí ostatních podobných vláken jsem svůj problém nevyřešil…

Jde jen o to, jak v nette udělat klasické spojení 2 tabulek.

Konkrétní příklad:

  • mám tabulku event (sloupce: id, name, icon_id) a tabulku icon (sloupce: id, name)
  • v šabloně chci vypsat název události (event.name) a název její ikony (icon.name), taže z toho bude ve výsledku třeba „Franta narozeniny | dárek“, „Závod rally | auto“, …

V phpMyAdminovi to jde udělat jednoduše SQL dozatem
SELECT event.name, icon.name AS icon_name FROM 'event' INNER JOIN icon ON event.icon_id = icon.id

Ale ani za boha nemůžu přijít na to, jak to napsat v nette.
$this->getTable()->select('event.*, icon.name AS icon_name');
mi vyhazuje \InvalidArgumentException – No reference found for $event->icon. :/

Pokud si někdo najde čas a napíše mi prosím ten jeden řádek kódu jak to má být správně, budu mu vděčný. Už se tady s tím rýpu půl dne, děkuju :)

Pavel Janda
Člen | 977
+
0
-

No, jde o spíš to, jestli toužíš používat NDBT, nebo šáhneš po dibi. NDBT není koncipována pro přímé joinování a pod.

Nebo jestli (jako skoro každý) přejdeš (dřív nebo později) na nějaké ORM. :)

Doporučuji zatím to dibi a potom po očku koukat na nějaké óeremku.

Edit:
Ještě přiblížím: NDBT = Databázová vrstva, která je nativně zakomponovaná v Nette. Je to zkratka pro Nette\Database\Table.
Dibi je další knihovna pro práci s databází, kterou však musíš připsat do composeru a skrze extension „zapnout“.

Editoval Pavel Janda (23. 7. 2015 16:36)

Mysteria
Člen | 797
+
0
-
foreach ($this->database->table('event') as $event) {
	echo $event->name;
	echo $event->icon->name;
}

Plus samozřejmě musíš mít nadefinovaný cizí klíč.

Editoval Mysteria (23. 7. 2015 16:49)