postgresql – automaticke cmuchani cizich klicu

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

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
+
0
-

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
+
0
-

Můžeš zkusit i tento hotfixnutý PostgreSQL driver. To o nastavení search_path platí i zde.

sniper
Člen | 2
+
0
-

hmm, to je naprd ze se musi nastavovat search_path, to mi defakto likviduje vyhodu schemat :) vic schemat pouzivam – jedno mam pro katalog, jedno pro uzivatele, jedno systemovy (logy apod.) a obcas delam selecty nad tabulkama pres vic schemat.

Milo
Nette Core | 1283
+
0
-

Zkusil jsi ten hotfixnutý driver?

Není to ideální, ale nevím proč by Ti to zlikvidovalo výhodu schemat. To je problém jednou zavolat:

SET search_path TO public,katalog,logy,buhvico
knoxa
Člen | 16
+
0
-

Ahoj, zrovna se mi tohle hodí. Potřeboval bych změnit schéma po připojení, předtím než se získá reflexe databáze. Nette\Database\Connection nemá property onConnect, tak kam je ideální umístit query se změnou schématu?

jiri.pudil
Nette Blogger | 1032
+
0
-

V masteru ano.

Editoval jiri.pudil (23. 5. 2013 18:54)

knoxa
Člen | 16
+
0
-

Ahaa, jsem koukal jen do API blbec. Diky za echo

Milo
Nette Core | 1283
+
0
-

Ve 2.0.x onConnect[] není, protože připojení k databázi ještě není lazy. Schema můžeš nastavit:

$connection->query('SET search_path TO schema');