Nette\Database automatický join na více slopuců
- motorcb
- Člen | 552
Zdravím.
Mám následující databázi:
CREATE TABLE `user` (
`id` INTEGER NOT NULL AUTO_INCREMENT DEFAULT NULL,
`nick` VARCHAR(30) NOT NULL,
`password` VARCHAR(128) NOT NULL,
...
PRIMARY KEY (`id`)
);
CREATE TABLE `fight` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`user_id` INTEGER NOT NULL,
`user_id_rival` INTEGER NOT NULL,
`date` DATETIME NOT NULL,
`text` MEDIUMTEXT NOT NULL,
PRIMARY KEY (`id`)
);
-- ---
-- Foreign Keys
-- ---
ALTER TABLE `fight` ADD FOREIGN KEY (user_id) REFERENCES `user` (`id`);
ALTER TABLE `fight` ADD FOREIGN KEY (user_id_rival) REFERENCES `user` (`id`);
Jedná se o tabulku uživatelů a tabulku bojů. V tabulce bojů je ID
uživatele, který bojoval(user_id) a ID uživatele se kterým
bojoval(user_id_rival).
Já bych celou tabulku potřeboval vypsat.
Presenter:
$this->template->fights = $this->context->createFight();
Template:
Ted nevím jak vypsat nicky obou bojovníků, když cizí klíče jsou
zdvojené…
{foreach $fights as $fight}
{$fight->date|date:'j.n.Y H:i'} {$fight->user->nick} - ???? tady vypsat druhého bojovníka <br/>
{/foreach}
Prvního bojovníka to vypíše, ovšem jak vypsat i toho druhého?
Nevěděl by někdo?
Editoval motorcb (27. 6. 2012 9:06)
- krucinal
- Člen | 38
hrach napsal(a):
// DiscoveredReflection {$fight->user->nick} vs. {$fight->rival->nick} // ConventionalReflection {$fight->user->nick} vs. {$fight->ref('user', 'user_id_rival')->nick}
Tohle by se mi libilo. Jak to uvedu v cinnost? At se snazim sebevic, nejsem schopny to rozjet. Potrebuju k tomu nejake specialni nastaveni Nette, nebo to funguje od prirody?
- enumag
- Člen | 2118
Nic speciálního není potřeba, respektive DiscoveredReflection vyžaduje definované foreign keys v DB a tedy InnoDB engine. Convenional nevyžaduje pokud vím nic.
Která z nich je výchozí si nejsem úplně jist, na localhostu a produkci se mi to chovalo pokaždé jinak a začalo to fungovat až když jsem explicitně nastavil discovered v config.neon.
- krucinal
- Člen | 38
Uz jsem to nekde dohledal. Skoda ze nette nema zadnou dokumentaci a clovek to musi vyzobavat po forech s nejistym vysledkem :(
Jak to udelat abych se k datum dostal pres → uz vim. Ted jen zapasim s tim, ze se mi to nechce joinovat v klasickem selectu. Resp. joinuje jen jednou, ale uz ne dvakrat.
Priklad: mam nejakou tabulku dejme tomu ‚clanky‘ a u ni sloupec ‚creator_id‘ (s cizim klicem). V nem je idcko uzivatele z tabulky users (s cizim klicem). V tabulce users je pak sloupec person_id s idckem z tabulky person (taky s cizim klicem).
$row = $connection->table('clanky')->get($neco);
echo $row->creator->person->prijmeni; // tohle funguje
Ale pruser zacne v selection:
$select = $connection->table('clanky')->select("clanky.*, creator.username"); // tohle jeste funguje (jeden join, username je v tabulce users)
ale
$select = $connection->table('clanky')->select("clanky.*, creator.person.prijmeni"); // tohle uz nejde
Neco mi rika, ze pro select je reflection mozne pouzit jen na jeden join, ale je to jen domnenka a dokumentace nulova.
Otazka tedy zni, jak v Nette\Database\Selection s nastavenym DiscoveredReflection na konektoru docilit joinovani tabulek propojenych cizimi klici dal nez pres jeden join.
Nevylucuju ze neco nekde pisu blbe, ale velmi ocenim nejaky odkaz na nette manual kde je toto popsane. Diky.