NDBT bug? Dva selecty na rovnaké dáta

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

Zdravím,
Prejdem rovno k veci.
Vyberám články z databázy a stránkujem ich.

			$articles = $blogArticles->findCategoryArticles($cat_ids);

			$vp = $this['vp'];
			$paginator = $vp->getPaginator();
			$paginator->itemsPerPage = 7;
			$paginator->itemCount = count($articles);

			$this->template->articles = $articles->limit($paginator->itemsPerPage, $paginator->offset);

Toto vyprodukuje dva selecty:

SELECT `id`
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24))
ORDER BY `created` DESC
SELECT `id`
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24))
ORDER BY `created` DESC
LIMIT 7

Ten druhý vyberá neviem prečo iba id. To spôsobí že pri výpise v šablone sa urobí ešte jeden select:

SELECT *
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24)) AND (`blog_articles`.`id` IN (72, 63, 62, 61, 60, 20,
59))
ORDER BY `created` DESC

Má to nejaké vysvetlenie, alebo čo to je?

Ďakujem.

Čamo
Člen | 798
+
0
-

Tak ak by niekto tiež toto riešil v budúcnosti, tak pridanie select(‚*‘) to vyrieši.

David Matějka
Moderator | 6445
+
0
-

Pro pocitani zaznamu pouzivej $articles->count('*'), to tvoje count($articles) vybere vsechny zaznamy (resp jejich id) a spocita velikost pole, coz je hodne neefektivni.

Čamo
Člen | 798
+
0
-

No akurát som nad tým rozmýšľal…

EDIT: Takže tým pádom je nežiadúce použiť select("*") a miesto count($articles)
treba použiť $articles->count('*')

Editoval Čamo (15. 6. 2015 16:35)