Jak na LFET, RIGHT JOIN a reflexe u hromadného výběru, nikoliv jednoho řádku

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

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

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

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

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?

enumag
Člen | 2118
+
0
-

Aha, tak s tím ti neporadím. NiftyGrid nepoužívám a ve své komponentě pro výpis mám ty sloupce vyřešené lépe, tak aby mi tohle nevadilo.

bumprask
Člen | 59
+
0
-

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)