Jak na LFET, RIGHT JOIN a reflexe u hromadného výběru, nikoliv jednoho řádku
- bumprask
- Člen | 59
Zdravím,
mám tabulky s touto strukturou:
PROGRESS
id (primární)
identity_id (cizí klíč do tabulky IDENTITY)
....
CONTACT
identity_id (primární klíč a zároveň cizí klíč do tabulky IDENTITY) - dědičnost
firstname
lastname
....
IDENTITY
id (primární)
....
Jak v této struktuře, založené na dědičnosti propojit v Nette Database tabulky PROGRESS a CONTACT? (tzv. aby se k tabulce PROGRESS provedl LEFT JOIN tabulky CONTACT)
Zatím jsem se dočetl o backjoin a zkoušel použít příkaz ->table(„progress“)->select(contact:*)->fetch()
což hodí chybu: uksort() expects parameter 1 to be array, null given
Nenapadá mě jiný mechanismus jak propojit tyto tabulky, kde nedodržení konvence způsobuje ona dvouznačnost identity_id, jež je primární i cizí klíč zároveň. Tím pádem jestli, nelze dodržet konvenci při těchto reflexích, jak je možné u hromadného výběru, nikoliv u práce s jedním řádkem (viz ->ref() a ->related() ), database sdělit, přes co propojit všechny tabulky a jak?
Díky.
Editoval bumprask (14. 11. 2012 16:19)
- bumprask
- Člen | 59
Backjoin v tomto případě nefunguje, jelikož se spoléhá na konvence a nelze v takovém příkazu zvolit, přes co se má s čím spojit…reflexi je možné do jisté míry ovládat při práci s jedním řádkem pomocí ->ref(), což je metoda objektu ActiveRow…tato možnost u Table\Selection zřejmě opravdu chybí…
Dá se to nějak obejít?
Editoval bumprask (14. 11. 2012 16:19)
- enumag
- Člen | 2118
NDB nepodporuje left join.
/** @var \Nette\Database\Table\Selection */
$identities = $connection->table('identity');
foreach ($identities as $identity) {
$contact = $identity->related('contact')->limit(1)->fetch();
if ($contact) { //$contact může být FALSE pokud daná identita není kontaktem
//...
}
}
Editoval enumag (14. 11. 2012 16:35)
- bumprask
- Člen | 59
To je právě to, já bych potřeboval výsledek bez dalších následujících dotazů…bude totiž použit jako vstup pro Nifty Grid, kde co vybraný sloupec to sloupec v gridu, žádné další procházení a dodatečné spojování typu ->related(), které si stejně dokážu představit spíš jenom pro výpis. Jednoduše, bych potřeboval mít vše pohromadě po provedení jednoho dotazu, bez cyklu. Dostat do objektu Table\Selection to samé co bych dostal prostým dotazem, kdybych použil ->query().
Je možná i nějaká transformace do podoby Table\Selection s informacemi z obou tabulek?
- bumprask
- Člen | 59
Tak tento problém řeší přímá definice joinu v této verzi:
https://forum.nette.org/…actoring-api
https://github.com/…/tree/db-dev
Editoval bumprask (15. 11. 2012 11:44)