Jak přinutit nette udělat více dotazů na místo jednoho
- Pilda
- Člen | 52
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 | 799
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);