postgresql – automaticke cmuchani cizich klicu
- sniper
- Člen | 2
Zdravim, tak se snazim proniknout do nette a mam maly problem s databazi. Jak jsem pochopil v tutorialu, pokud na nette database tabulce zavolam fetchAll(), je to samo schopne si vycmuchat cizi klice, coz mi ale nefunguje.
Mam postgresovou databazi a v ni ve schematu katalog tabulky zbozi a dodavatel. V tabulce zbozi je sloupec dodavatel_id, ktery je pomoci ciziho klice fk_dodavatel pripojen na sloupec id v tabulce dodavatel. (schema databaze zde – http://pastebin.com/06hxSCHg).
V nette mam zaregistrovanou servicu zboziRepository a dodavatelRepository (vicemene shodnou s temi v tutorialu. jenom jsem lehce upravil v repository metodu getTable, ze nebere nazev tabulky z nazvu tridy ale ma ji nastavenou v protected promenny). V prezenteru pak volam na zboziRepository metodu fetchAll(), vysledek predavam do view a tam se to snazim vypsat pomoci foreach takto ($zbozi je jeden prvek toho foreach) <td>{$zbozi->dodavatel->nazev}</td>. Ostatni sloupce to krasne vypise, ale u tohohle to zarve "Cannot read an undeclared column "dodavatel"".
Co delam spatne? Podle toho, co se pise v dokumentaci, by se pri volani $zbozi->dodavatel mel podle klice zavolat select nad tabulkou dodavatel, coz ale evidentne neudela. Jak mam v tomhle pripade pracovat s koncepci db schemat? Repository o svojim schematu vi. Priznam se ze pokud to nejde, pripadne bych musel volat neco jako $zbozi->schema.tabulka, tak pro me nette ztraci vyznam. Nette debugbar pise ze vola 2 dotazy (to by odpovidalo), bohuzel se nechce nechat rozkliknout a rict mi jake. Pripojeni k db mam konfigurovane takto:
nette:
application:
errorPresenter: Error
database:
dsn: ‚pgsql:host=localhost;port=5432;dbname=vodnice4u‘
user: vodnice4u
password: heslo
reflection: discovered
Diky za jakekoliv nakopnuti. Pouzivam aktualni verzi nette pres composer, php 5.4
- Milo
- Nette Core | 1283
To SQL schéma z pastebin není validní. Příště postni něco ne tak ořezaného. A i nějaký konkrétní kód.
Jelikož používáš schéma katalog
, musíš si po vytvoření
Connection nastavit SET search_path TO katalog
. Reflexe databáze
v PostgreSQL driveru používá current_schema()
. Pokud ale
používáš více schémat najednou, tohle nepomůže, driver to zatím neumí.
Pokud bys to potřeboval, naimplementuju to, stejně jsem se na to chystal.
Můžeš to nastavit např. takhle:
$connection->onConnect[] = function($conn) {
$conn->query('SET search_path TO katalog,public');
};
- Milo
- Nette Core | 1283
Můžeš zkusit i tento
hotfixnutý PostgreSQL driver. To o nastavení search_path
platí i zde.