Nette\Database a primitivní spojování tabulek
- tomaass
- Člen | 74
Ahoj,
začínám s Nette\Database a mým cílem je udělat program nad databízá jedné firmy ⇒ neměl bych dělat změny v DB.
Potřebuju spojit dvě tabulky, opravdu primitivně, ale nechci na to psát nějaký SQL dotaz, když je tady skvělé Nette\Database … a vůbec. Nebylo by hezčí psát
// 1 : N
$package->location->locationname;
místo tohoto?
$row = $connection->query("SELECT package.*, locations.* FROM package, locations
WHERE package.barcode = ".$values->barcode." AND
package.locationid = locations.id;")->fetch();
Myslím že bylo.
Problém je v tom, že se mi to ještě nepodařilo.
Respektive, nedaří se mi to spojit, kvůli „nekonvenčnímu“ pojmenování
sloupců.
A metoda ref()? Nikdy jsem ji nepoužil, protože mi příjde k ničemu. Je
omezující, když bere jméno tabulky a jméno sloupce. Proč tam není něco
jako ref($cilova_tabulka, $sloupec_zdrojove_tabulky, $sloupec_cilove_tabulky) ??
Nebylo by to užitečné?
Nebo jsem jen nepochopil jak se to používá?
Zkoušel jsem:
$values->ref('locations', 'locationid')->locationname;
// CHYBA
// Trying to get property of non-object
Jak toto vyřešit? Jak spojím ty dvě tabulky tak elegantně, abych to mohl provádět i v šabloně?
CREATE TABLE package
(
...
locationid integer,
barcode integer NOT NULL <---- PK
)
CREATE TABLE locations
(
id integer NOT NULL, <---- PK
locationname character varying(100)
)
Děkuji.
- nanuqcz
- Člen | 822
Ahoj,
pokud má ta firma vlastní konvence pro databázi, pak musíš Nette\DB tyto
konvence naučit. To znamená:
- Napsat vlastní reflexi
- Říct Nette databázi, aby tuto reflexi začala používat:
# config.neon
nette:
database:
default:
dsn: ...
reflection: MyReflection
Pak ti začne fungovat klasické spojování tabulek přes tabulka1.tabulka2 atd. ;-)
- nanuqcz
- Člen | 822
Doufal jsem, že nette database je o něco ‚vymakanější‘. Nechci se psát s nějakými nesmysly protože na to není čas.
Nějaké „vymakanější“ věci má Hrach rozpracované („Nové backjoin api“, „Absolutní cesta joinu“), ale nevím, jestli (a v jaké podobě) se dostanou do oficiálního Nette. Každopádně Hrach tu svojí verzi bude mít určitě někde na githubu, tak můžeš pohledat a vyzkoušet ;-)
Editoval nanuqcz (5. 12. 2012 14:06)
- vvoody
- Člen | 910
tomaass napsal(a):
$values->ref('locations', 'locationid')->locationname; // CHYBA // Trying to get property of non-object
Podla tej chyby zrejme nemáš problém s nesprávnym referencovaním. Tie parametre funkcie ref si použil správne a ten tretí $sloupec_cilove_tabulky, ktorý by si tam chcel mať, má nette defaultne ako PK cieľovej tabuľky. Pozri sa do debug baru, či tam náhodou nieje query ktoré vrátilo 0 riadkov.