Propojení tabulek M:N v dotazu
- kedro
- Člen | 4
Zdravím, snažím se hledat, ale nějak nedokážu pochopit, jak mám propojit tabulky M:N dotazem.
Příklad:
TAB1: Kniha (sloupce: id, nazev)
TAB2: Autor (sloupce: id, jmeno)
TAB3: kniha_autor(sloupce: id_kniha, id_autor) // alternativně sloupce:
kniha_id, autor_id (pokud to musi byt pojemnovano takto…)
Raději sem ani nepíšu kód, protože je to pokus / omly. Pomůže někdo s dotazem:
- „Získat všechny kniha.nazev, sloupec.autor – tzn. všechny knihy se jmenem autora“
- „Získat všechny autory s nazvy knih, co napsali“
- „Získat všechny autory a knihy, s NULL hodnotou, pokud autor nenapsal knihu nebo kniha je bez autora (logický nesmysl), ale jde o příklad)“
Pokud možno bez Dibi, přímo pomocí Nette\Database
Moc děkuju …
Editoval kedro (31. 7. 2014 11:25)
- David Matějka
- Moderator | 6445
//1) (kecam, blbe jsem to asi pochopil, viz prispevek vvoodyho) :)
$database->table('kniha')->where(':kniha_autor.id_autor', $id);//dle id autora
$database->table('kniha')->where(':kniha_autor.autor.jmeno', $jmeno);//dle jmena autora
//2)
foreach($database->table('autor') as $autor) {
foreach($autor->related('kniha_autor') as $autorKniha) {
echo $autorKniha->kniha->nazev;
}
}
//3) (asi)
$database->table('autor')->where(':kniha_autor.id_kniha IS NULL');
//respektive
$database->table('kniha')->where(':kniha_autor.id_kniha IS NULL');
Editoval matej21 (31. 7. 2014 12:07)
- vvoody
- Člen | 910
A:
{foreach $knihy as $kniha}
{foreach $kniha->related('kniha_autor') as $knihaAutor}
{$kniha->nazev} - {$knihaAutor->autor->jmeno}
{/foreach}
{/foreach}
B: ako A ale obrátene
C: na to si buď napíš celé query (cez NDBT také query asi nevytvoríš)
alebo vyber všetkých autorov/knihy a priamo v kóde ich prefiltruj
Btw čo z A a B nieje napísané v dokumentácií alebo to tam je nejasne napísané?
- kedro
- Člen | 4
vvoody napsal(a):
A:
{foreach $knihy as $kniha} {foreach $kniha->related('kniha_autor') as $knihaAutor} {$kniha->nazev} - {$knihaAutor->autor->jmeno} {/foreach} {/foreach}
B: ako A ale obrátene
C: na to si buď napíš celé query (cez NDBT také query asi nevytvoríš) alebo vyber všetkých autorov/knihy a priamo v kóde ich prefiltrujBtw čo z A a B nieje napísané v dokumentácií alebo to tam je nejasne napísané?
Díky vyzkouším. V dokumentaci je podobný příklad, jenom pro mě jako samouka je dost obtížné to všechno pojmout narychlo a uvědomit si souvislosti. Zkoušel jsem to a nešlo mi to, asi jsem pletl jeden příklad s druhým. Pořád jsem řešil, že mám v modelové třídě funkci něco jako „getAllBooks()“ a nedařilo se mi načíst do proměnné seznam z DB, který bych pak iterací vypsal v .latte šabloně.
Jsou to moje první kroky s nějakým PHP frameworkem, taks tím trochu bojuju a přiznám se, že v dokumentaci je hodně věcí, ale jsou psány tak, že tomu rozumí ten, kdo ví o co jde. Návod pro „zelenáče“ to úplně není a myšlení bolí :o) … ale já to zvládnu. Postupně.
Díky.
- kedro
- Člen | 4
matej21 napsal(a):
//1) (kecam, blbe jsem to asi pochopil, viz prispevek vvoodyho) :) $database->table('kniha')->where(':kniha_autor.id_autor', $id);//dle id autora $database->table('kniha')->where(':kniha_autor.autor.jmeno', $jmeno);//dle jmena autora //2) foreach($database->table('autor') as $autor) { foreach($autor->related('kniha_autor') as $autorKniha) { echo $autorKniha->kniha->nazev; } } //3) (asi) $database->table('autor')->where(':kniha_autor.id_kniha IS NULL'); //respektive $database->table('kniha')->where(':kniha_autor.id_kniha IS NULL');
Děkuju, právě ten příklad
$database->table(‚kniha‘)->where(‚:kniha_autor.id_autor‘, $id);//dle id autora
Mě nakopnul. Pravda je to v dokumentaci, ale až tady jsem to pochopil (doufám). Dííííky !