dvojitý join pomocí nette\database
- had12
- Člen | 28
Ahoj,
prosím o radu… rád bych za pomocí nette\database provedl následující
dotaz, který vybere data ze dvou tabulek, které jsou spojeny mezi sebou
pomocí třetí (tabulky files, keywords a files_keywords). Jedná se tedy
o JOIN nad třemi tabulkami, ale nechci na to používat ->query(…) a ani
nechci používat pohledy v databázi. Poradíte, prosím, jak na to?
Děkuji :)
- James_Scott
- Člen | 55
Ahoj, mrkni do dokumentace – dole je ukázkové schéma tabulek book, tag, book_tag…
$books = $context->table('book');
foreach ($books as $book) {
echo 'title: ' . $book->title;
echo 'written by: ' . $book->author->name;
echo 'tags: ';
foreach ($book->related('book_tag') as $bookTag) {
echo $bookTag->tag->name . ', ';
}
}
- had12
- Člen | 28
Mám něco takového:
model:
return $this->connection->table('files')->order('date DESC, title');
default.latte
{foreach $files as $file}
<strong>{$directive->title}</strong><br />
{foreach $file->related('files_keywords') as $kw}
{$kw->keywords->description}
{/foreach}
{/foreach}
v bláhové naději, že mi to poběží skáče: No reference found for $kw->related(files_keywords)… chápu, že nette postrádá propojení mezi tabulkami, ale principiálně je to správně, nebo ne??
- Oli
- Člen | 1215
Myslím, že podle části názvu sloupce cizího klíče. Takže by mělo
fungovat pro tabulky prefix_articles
a
prefix_categories
pokud je v té první třídě cizí klíč
category_id
něco jako:
$article->category->name;
$article->prefix_category->name; // tohle nebude fungovat
nejsem si tím ale jistej. Můžeš to zkusit nebo počkat jestli nenapíše někdo kdo to ví líp ;-)
- David Matějka
- Moderator | 6445
pro „has one“ je klicovy nazev spojovaciho sloupecku, pro „has many“
(related) je klicovy nazev spojovaci tabulky. viz https://doc.nette.org/…ase/explorer
Pokud mas tedy spravny FK, tak by
$file->related('files_keywords')
melo fungovat
Editoval matej21 (20. 5. 2014 23:32)
- had12
- Člen | 28
a šel by nějakým způsobem udělat opačnej způsob odkazování? Ne left join, ale right join (tedy při procházení souborů volat vnořený foreach a odkazovat se na případně existující spojení v tabulce files_keywords a z ní pak na keywords)? tabulka files přece neobsahuje ID z tabulky files_keywords, ale právě naopak – files_keywords má ID z tabulky files…
tady dávám náhled databáze + toho, čeho chci dosáhnout, snad mi bude
líp rozuměno :-)
http://www.nahraj-obrazek.cz/?…
- David Matějka
- Moderator | 6445
Prave pro smer „to many“ je funkce related. Mas spravne nastaveny cizi klice a pouzivas discovered reflection? (v configu v sekci databaze, pokud nemas uvedeno, tak defaultni je prave discovered)