Výpis článků závislý na jejich typu

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

Mám vyvořené následující tabulky (+další, které nejsou momentálně podstatné):

  • clanek (ID, uvodniText, text, datum, cas, typ, zobrazit, uzivatel_id)
  • zapas (ID, datum, cas, typ, sdp, shp, sdk, shk, sezona_id)
  • pratelskyzapas (ID, domaci, hoste, zapas_id)
  • ligovyzapas (ID, kolo, domaci_id, hoste_id, zapas_id)
  • textovyclanek (ID, nadpis, clanek_id)
  • vysledkovyclanek (ID, zapas_id, clanek_id)

Potřebuju vypsat na hlavní stránku všechny články. A to tak, že vyhledám všechny články, poté rozliším o jaký typ článku se jedná (typ = 0 ⇒ textovyclanek, typ = 1 ⇒ vysledkovyclanek). Pokud se jedná o textovyclanek, jednoduše články vypíšu. V opačném případě (vysledkovyclanek) musím rozlišit zda se jedná o pratelskyzapas nebo ligovyzapas (abych mohl vyhledat a vypsat data z dané tabulky).
Zkoušel jsem toho hodně, ale pořád je problém s výpisem vysledkových článků. Buď vypíše jeden (poslední) pratelskyzapas + jeden (poslední) ligovyzapas nebo najde jen pár z nich, ale ne všechny.
Když jsem zkoumal „Nette lištu“, nevim proč tak se mi postupně „násobil“ where např. SELECT * FROM pratelsky zapas WHERE(zapas_id = ?) AND (zapas_id = ?) potom je tedy jasné, že nemůže nic najít. Ale v čem je chyba?
Momentálně mám něco takového:

//presenter
$this->template->xclanek = $this->clanek->findAll();
$this->template->xpratelak = $this->pratelskyzapas->findAll();
$this->template->xmistrak = $this->ligovyzapas->findAll();

//šablona - zjednodušeně
{foreach $xclanek as $clanek}

	{if $clanek->typ == 0}
		{foreach $clanek->related('textovyclanek', 'clanek_id') as $tclanek}
			{$tclanek->nadpis}<br />
			{$clanek->text|truncate: 300}
		{/foreach}

	{else}
		{foreach $clanek->related('vysledkovyclanek', 'clanek_id') as $vclanek}

			{if $vclanek->zapas->typ == 0}
				{foreach $xpratelak->where('zapas_id', $vclanek->zapas_id) as $pratelak}
					{$pratelak->domaci} &ndash; {$pratelak->hoste}<br />
					{$clanek->text|truncate: 300}
				{/foreach}

			{else}
				{foreach $xmistrak->where('zapas_id', $vclanek->zapas_id) as $mistrak}
					{$mistrak->domaci->tym} &ndash; {$mistrak->hoste->tym}<br />
					{$clanek->text|truncate: 300}

				{/foreach}
			{/if}

		{/foreach}
	{/if}

{/foreach}
vvoody
Člen | 910
+
0
-

Fujerko napsal(a):

Ale v čem je chyba?

V tom že tam tie podmienky dokola pridávaš. Vidím že funkciu related použiť vieš, tak prečo ju nepoužiješ aj na získanie zápasov?

Editoval vvoody (29. 3. 2013 23:31)

Fujerko
Člen | 4
+
0
-

vvoody nějaké možnosti s related jsem zkusil, ale nenašel jsem tu správnou, mohl bys mě aspoň trochu navést pokud víš jak na to v tomto konkrétním příkladě?

vvoody
Člen | 910
+
0
-

Treba zmeniť

{foreach $xpratelak->where('zapas_id', $vclanek->zapas_id) as $pratelak}

na niečo ako

{foreach $vclanek->zapas->related('pratelskyzapas', 'zapas_id') as $pratelak}

To iste aj mistrak. Možno by bolo prehľadnejšie si ten jeden riadok fetchnut do premennej, namiesto toho iterovania nad selectionom ktorý by aj tak mal mať vždy len jeden výsledok.

Fujerko
Člen | 4
+
0
-

vvoody Nevím jak bych se ti mohl odvděčit:) Funguje to tak jak má, mockrát díky;)

{foreach $vclanek->zapas->related('pratelskyzapas', 'zapas_id') as $pratelak}

Nenapadlo mě udělat takovou „vazbu“: $vclanek->zapas->related.. asi proto je tento příspěvek v dané kategorii začátečníci:) Ještě jednou, díky moc!