Výběr cizího klíče při použití tečkové notace
- nanuqcz
- Člen | 822
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
- nanuqcz
- Člen | 822
->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
- nanuqcz
- Člen | 822
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
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
- ajda2
- Člen | 66
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