Poslední dobou hodně válčím s Nette Database. Nemám tolik znalostí a zkušeností, abych mohl říct, že je špatná, nicméně velice často se chová naprosto nepředvídatelně.

Všechny problémy, které jsem zaznamenal, jsou většinou spojeny s provázáním tabulek pomocí cizích klíčů. Na fóru radí respektovat pojmenování cizích klíčů podle tabulek (mimochodem – MyISAM podporuje cizí klíče?). Používám InnoDB a možná trochu méně přehlednou a především méně předvídatelnou strukturu databáze a pravděpodobně díky tomu se občas vyskytnou problémy.

Modelová situace

Mějme příklad – restaurace má pro každý den polední menu, které se skládá z jednotlivých jídel. Návštěvník si může jídlo rezervovat a zajistit si tak, že i když přijde do restaurace na oběd v půl druhé odpoledne, tedy v době, kdy jsou ta nejlepší jídla již dávno vyprodána, dostane to, na co má chuť.

Schéma databáze

Výpis rezervací

Aby to celé k něčemu bylo, potřebuje provozní restaurace znát seznam lidí, kteří si v daném dnu/týdnu rezervovali svůj oběd. Pro začátek tedy vybereme z databáze jídla, která jsou přiřazena k danému datu:

1
$this->database->table('mod_food_week_menu')->where('date', $date)->order('order');

V šabloně by mělo být opravdu snadné vnořit se dále do struktury a získat odkazované prvky pomocí cizího klíče ‘food_id’ (pozn.: jedná se o Latte syntaxi):

1
{$food->ref('mod_food_item', 'food_id')->size}

Není to tak snadné

Laděnka nám bohužel oznámí, že to nebude tak snadné. Ve skutečnosti je problém v tom, že Nette si z databáze vytáhne jen ty sloupce, které si myslí, že potřebuje. Cizí klíč “food_id” přeskočí, a proto není možné vnořit se hlouběji do struktury pomocí cizího klíče.

Řešení

Řešení vyplývá z podstaty problému – stačí natvrdo nastavit, které sloupce je potřeba vybrat v rámci SQL dotazu. Toho dosáhneme jednoduchým přidáním ‘select(“*”)’. Změní se tedy pouze kód v modelu:

 

1
return $this->database->table('mod_food_week_menu')->select("*")->where('date', $date)->order('order');

Závěr

Co říct na závěr? Že už brzy budou moct ajťáci a všichni další v Budějovicích, kteří nevstávají do kolbenky na šestou, chodit na obědy až ve chvíli, kdy jim opravdu poručí hlad, a ne když jim poručí strach z toho, že na ně zbyde zeleninovej salát :-).