Výběr cizího klíče při použití tečkové notace

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

Ahoj,
narazil jsem v Nette\Database na nepříjemný problém. Mějme dvě tabulky:

Jak je vidět, k tabulce user se jde z article dostat přes dva různé sloupečky (moderator_id a creator_id).

Chtěl bych pomocí NetteDB získat všechny články, a k nim jméno moderátora, který je ke článku přiřazen. Jak na to?

$db->table('article')->select('title, user.login AS moderator')
	->fetchPairs('title', 'moderator');

…toto bohužel z mě neznámých důvodů spojí ty dvě tabulky přes sloupeček creator_id. Můžu to nějak změnit, aby spojování probíhalo přes sloupeček moderator_id?

Díky za nápady

vvoody
Člen | 910
+
0
-

Je nevyhnutny join? (napriklad pre filtrovanie na zaklade dat z tabulky user)

ViPEr*CZ*
Člen | 817
+
0
-

Dělal bych to, že bych si vybral article a k těm pak přes ref metodu hledal moderátora až při procházení articlů. Taky by mě zajímalo jestli jde získat asociativní pole (případně si ho holt sestavit sám).

nanuqcz
Člen | 822
+
0
-

ViPErCZ: To právě nemůžu (složitost aplikace, na které teď dělám, to bohužel neumožňuje)

vvoody: Myslel jsi asi to samé, co Viper, že? ref() použít v tomhle případě nemůžu.

Editoval nanuqcz (25. 7. 2012 21:47)

jtousek
Člen | 951
+
0
-

Tohle bych asi dal rovnou do sekce hlášení chyb.

hrach
Člen | 1838
+
0
-

Blahopřeji, si první, kdo narazil na tuto nedokonalost, o které vím a mám nápad na řešení. Není to chyba, je to spíš vlastnost no. Ale bude to chtit novou syntaxi. Do budoucna cca

->select('title, user(moderator_id).login AS moderator')
nanuqcz
Člen | 822
+
0
-
->select('title, user(moderator_id).login AS moderator')

Přesně tohle jsem zkoušel a tajně doufal, že to bude fungovat :-D Zatím jsem to vyřešil tak, že vypisuju celý dotaz ručně přes $db->query().

Každopádně doufám, že se tohle brzo dostane do Nette (snad to David nezamítne, jako jiné věci). Díky

hrach
Člen | 1838
+
0
-

Hele, kdyz nad tim tak premyslim, tak sem se spletl.
Toto by melo fungovat:

->select('title, moderator.login')
nanuqcz
Člen | 822
+
0
-

hrach: Díky. Chtěl jsem to právě refactorovat v projektu, a zjistil jsem, že můj problém je opačný :-) Tzn., potřebuju se z tabulky user dostat na article přes cizí klíč moderator_id.

Tady už asi bohužel nepomůže nic jiného, než ta závorková syntaxe…

$db->table('user')->where('article(moderator_id).id', 1);
Skippous
Člen | 21
+
0
-

Ahoj, asi jsem narazil na stejný problém. Potřebuji naplnit datasource pro NiftyGrid a nevím si rady. Výše uvedená syntax by byla super, potřebuji něco ve tvaru:

$source = new \NiftyGrid\NDataSource(
                   $this->dokument->select("dokument.*, uzivatel(autor_uzivatel_id).jmeno AS autor")
   );
   //Předáme zdroj
   $this->setDataSource($source);

Nenapadá mě jak to elegantně vyřešit a právě začínám jeden větší projekt, takže se mi nechce pro každý grid psát ručně $db->query()..díky za rady

mildhouse
Člen | 27
+
0
-

Mě spíš nejde do hlavy, proč ten první příklad :

$db->table('article')->select('title, user.login AS moderator')
    ->fetchPairs('title', 'moderator');

nehlásí chybu „No reference found for $article->user“ a místo toho spojí tabulky přes creator_id

saimons
Člen | 293
+
0
-

Nevi pres kterej klic to ma spojit, tak jednoduse (dle meho nazaoru) veme tu relaci, ktera je ulozena v systemove tabulce jako prvni.

Editoval saimons (21. 4. 2013 13:46)

mildhouse
Člen | 27
+
0
-

No ale proč se nesnaží najít sloupec user_id a nevyhodí chybu (což by bylo správně, protože sloupec user_id neexistuje)? Mě to chybu vyhodí v Nette v. 2.0.3 i v. 2.0.10

sKopheK
Člen | 207
+
0
-

hrach napsal(a):

->select('title, user(moderator_id).login AS moderator')

Díky, funguje! Možná by nebylo od věci přidat to do tutoriálu. Nebo jsem to někde přehlédl?

ajda2
Člen | 66
+
0
-

sKopheK napsal(a):

hrach napsal(a):

->select('title, user(moderator_id).login AS moderator')

Díky, funguje! Možná by nebylo od věci přidat to do tutoriálu. Nebo jsem to někde přehlédl?

Zkoušeli jste to někdo v Nette 2.1.2?
Já při tomto dostanu výjimku Nette\Database\Reflection\MissingReferenceException