NDB, nestandardní názvy sloupců a joiny
- looky
- Člen | 99
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)
- looky
- Člen | 99
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)
- looky
- Člen | 99
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
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
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?
:)