NDB, nestandardní názvy sloupců a joiny

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
looky
Člen | 99
+
0
-
table1
 table_id int primary key
 table2_id int|null references table2 (table2_id) on delete set null
 description string
 ...
table2
 table2_id int primary key
 table_id int references table1 (table_id)
 ...

Vysvětlení:

  • Položky z table2 musí patřit právě jedné položce z table1 (table2.table_id = table1.table_id).
  • Položky z table1 mohou aktuálně používat jednu z jim patřících položek z table2 k nějaké činnosti (table1.table2_id = table2.table2_id). Dejme tomu, že kontrolu že používají položku která opravdu patří jim zajistí někdo jiný.

Zadání:
Vybrat seznam všech položek z table2 spolu s description sloupcem příslušné položky z table1.

SELECT table2.*, table1.description FROM table2 JOIN table1 ON (table2.table_id = table1.table_id)

Ví někdo, jak tohle napsat v NDB 2.1-dev? Přísahal bych, že už jsem zkusil všechny kombinace, a stále nemůžu najít fungující řešení. Prosím?

EDIT: Ještě doplním že reflexe je discovered (pokud je tato informace k něčemu užitečná), a že jsem si vědom toho že mám nestandardní názvy sloupců.

EDIT2: Opraveno zadání.

Editoval looky (17. 7. 2013 17:02)

hrach
Člen | 1838
+
0
-

Jop, tak toto nejde. Cizi klice se jmenuji cizi od toho, ze jsou to (primarni) klice dane tabulky (nevim, kecam, hadam, ale takto to vsichni pouzivaji). Resenim by bylo mit asi nejakou spojovou tabulku? Nevim, ale vypada to dokonce na spatny navrh.

looky
Člen | 99
+
0
-

Pro zjednodušení, zapomeňme na sloupec table1.table2_id. Pak máme tabulku table2, jejíž sloupec table1_id odkazuje na primární klíč table1_id tabulky table1. Opravdu tohle nejde?

EDIT: Návrh opravdu je špatný. Musím ale nějak pracovat s tím co mám :(

Editoval looky (17. 7. 2013 16:28)

hrach
Člen | 1838
+
0
-

Tak to samozrejme jde.

$selection->table('table2.*', 'table1.description');
vvoody
Člen | 910
+
0
-

Ja si myslím že Discovered by s tým nemal mať problém

$table2selection->select('table2.*, table1.description');

aký error ti to hlási? No reference found?

Editoval vvoody (17. 7. 2013 16:35)

looky
Člen | 99
+
0
-

vvoody napsal(a):

Ja si myslím že Discovered by s tým nemal mať problém

$table2selection->select('table2.*, table1.description');

aký error ti to hlási? No reference found?

No reference found for $table2->table1

vvoody
Člen | 910
+
0
-

Aká databáza? Mysql s innoDB tabuľkami?

looky
Člen | 99
+
0
-

vvoody napsal(a):

Aká databáza? Mysql s innoDB tabuľkami?

Postgres.

Hmm koukám že k tomu všemu jsem se ještě přepsal v zadání. Primární klíč tabulky table1 se nejmenuje table1_id, ale dejme tomu table_id. Odkazující sloupec z tabulky table2 se samozřejmě jmenuje také table_id. Ach jo.

vvoody
Člen | 910
+
0
-

Driver pre postgres by mal vedieť zistiť FK ak ich máš nastavené. Problém bude asi v tom table1_id table_id. Pri Discovered je podstatný názov FK stĺpca takže skús.

$table2selection->select('table2.*, table.description');

je to preto aby bolo jasné ktorý FK sa má použiť keď máš v jednej tabuľke dva FK na tú istú tabuľku. Npr máme tabuľky book a user, tabuľka book má FK author_id a editor_id, v tomto prípade môžeme nad riadkom jednej knihy jednoducho získať autora aj editora

$book->author->name;
$book->editor->name;

pomenovanie tabuľky user je nepodstatné

edit:
pre lepšie pochopenie ešte jeden dvojitý join

$bookSelection->select('book.*, author.name, editor.name');

vytvorené query bude mať dva joiny na tú istú tabuľku user pričom budú aliasované ako „AS author“ a „AS editor“

Editoval vvoody (17. 7. 2013 17:16)

looky
Člen | 99
+
0
-

vvoody napsal(a):

Problém bude asi v tom table1_id table_id. Pri Discovered je podstatný názov FK stĺpca takže skús.

$table2selection->select('table2.*, table.description');

No, tak tohle šlape. Vygenerované SQL:

SELECT table2.*, table.description FROM table2 LEFT JOIN table1 AS table ON table2.table_id = table.table_id

Díky moc!

A teď si rýpnu do zdejších Nette gurus: Kde je ta zatracená dokumentace?

:)

hrach
Člen | 1838
+
0
-

Nikde, protoze misto psani ti tu delam podporu :P :)