Propojení tabulek M:N v dotazu

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

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:

  1. „Získat všechny kniha.nazev, sloupec.autor – tzn. všechny knihy se jmenem autora“
  2. „Získat všechny autory s nazvy knih, co napsali“
  3. „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
+
0
-
//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
+
0
-

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

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 prefiltruj

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

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 !