Jak přinutit nette udělat více dotazů na místo jednoho

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

Mám takový problém. Dělám statistiku fóra a chci tam mimo jiné vypsat tyto dvě statistiky: 10 témat s nejvíce příspěvky a 10 nejčtenějších témat. Pro obojí sahám do jedné tabulky. Problém ovšem je, že na to zřejmě potřebuji dva samostatné dotazy do DB, protože každý ten dotaz je jiný. Nette se mi ty dotazy snaží spojit, ale to nejde, protože se ty dva dotazy vylučují.

Jak přinutím nette, aby udělala skutečně dva dotazy místo jednoho? Tahám to takto:

		// generuje nejčtenější vlákna na fóru
		$this->template->most_read_threads = $this->table_threads
				->select('forum_threads.*')
				->select('count(DISTINCT forum_posts:id) AS postsCount')
				->group('forum_threads.id')
				->order("counter DESC")
				->limit(10);

		// generuje vlákna s nejvíce příspěvky
		$this->template->biggest_threads = $this->table_threads
				->select('forum_threads.*')
				->select('count(DISTINCT forum_posts:id) AS postsCount')
				->group('forum_threads.id')
				->order("postsCount DESC")
				->limit(10);
uestla
Backer | 796
+
0
-

Jde o logický přístup k věci.

Jedna instance Nette\Database\Table\Selection představuje jeden položený SQL dotaz. Čili nejpřímočařejší v tvém případě by bylo si před položením 1. dotazu instanci naklonovat a klon použít pro druhý dotaz…

Lepší přístup pak je pomocí továrniček (které při každém přístupu právě unikátní instanci vracejí)…

# config.neon
common:
	services:
		# @database, ...

	factories:
		tableThreads: @database::table( table_threads )

a v presenteru

$this->context->createTableThreads()
	->select('forum_threads.*')
	->select('count(DISTINCT forum_posts:id) AS postsCount')
	->group('forum_threads.id')
	->order("counter DESC")
	->limit(10);

$this->context->createTableThreads()
	->select('forum_threads.*')
	->select('count(DISTINCT forum_posts:id) AS postsCount')
	->group('forum_threads.id')
	->order("postsCount DESC")
	->limit(10);
Pilda
Člen | 52
+
0
-

Díky moc, fachá to.