Problém s SQL dotazem – řetězení podmínek

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

Zdravím.

Dělám jednoduché fórum, kde vypisuji kategorie a počet témat. Počet témat mi to však vypíše správně pouze u první kategorie.

	{foreach $categories as $category}
	<tr>
		<td>
			<a n:href="topics $category->id"><strong>{$category->name}</strong></a><br />
			{$category->description}
		</td>
		<td>{count($topics->where('category_id', $category->id))}</td>
	</tr>
	{/foreach}

Z laděnky jsem zjistil, že to pokládá na databázi špatné dotazy.

  1. dotaz: SELECT id FROM forum_topics WHERE (category_id = 1)
  2. dotaz: SELECT * FROM forum_topics WHERE (category_id = 1) AND (category_id = 2)

atd.

Nevím, proč se tam vždy natahují a řetězí podmínky (where) z minulých dotazů. Používám Nette\Database.

Děkuji za radu, vím, že jde určitě o nějakou blbost, ale nějak se nemohu dostat dál z místa.

Jan Mikeš
Člen | 771
+
0
-

Je to tim, ze pro nove dotazy pouzivas stejnou promennou a vse delas pres puvodni dotaz.

Ty pouzivas neco takoveho:

	$row = $this->context->xxx; // vrati ti Selection
	$row->where("category_id", 1);
	$row->where("category_id", 2);

Ty ale potrebujes toto:

	$row = $this->context->xxx; // vrati ti Selection
	$row->where("category_id", 1);
	$row2 = $this->context->xxx;
	$row2->where("category_id", 2);

V tvem pripade doporucuji pouzit https://api.nette.org/…tiveRow.html#…

Editoval Lexi (30. 8. 2012 14:42)

mkoubik
Člen | 728
+
0
-

Protože pracuješ stále s tím samým objektem $topics. Nejlepší řešení by bylo využít relaci té konkrétní kategorie a objekt $topics vůbec nepoužívat:

<tr n:foreach="$categories as $category">
        <td>
                <a n:href="topics $category->id"><strong>{$category->name}</strong></a><br />
                {$category->description}
        </td>
        <td>{$category->related('forum_topics')->count()}</td>
</tr>

Nebo si ten objekt v každém cyklu klonovat (podle mě prasárna).