Nette\Database a primitivní spojování tabulek

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

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

Ahoj,
pokud má ta firma vlastní konvence pro databázi, pak musíš Nette\DB tyto konvence naučit. To znamená:

  1. Napsat vlastní reflexi
  2. Ří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. ;-)

tomaass
Člen | 74
+
0
-

bohužel, jejich konvence jsou pro každou tabulku jiné ⇒ prasárna jak dělo.

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.

Škoda. Ale díky za info

nanuqcz
Člen | 822
+
0
-

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

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.