dvojitý join pomocí nette\database

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

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

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

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??

Mysteria
Člen | 797
+
0
-

Ano je to správně. Nezapomeň mít správně nadefinované cizí klíče nebo dodržovat konvence pojmenování sloupečků (podle toho, co používáš).

had12
Člen | 28
+
0
-

…kdybych přejmenoval tabulku třeba na prefix_files, způsobovalo by to stejnej problém? Podle čeho si „ochmatává“ nette automatický klíče? Reaguje na první podtržítko + id, nebo na poslední..?

Oli
Člen | 1215
+
0
-

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

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

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

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)