Załóżmy, że mam klasę Category i Product taka jak tutaj : http://symfony.com/doc/current/book/doctri...ps-associations .
$em = $this->get('doctrine.orm.entity_manager'); $dql = "SELECT a FROM VendorBlogBundle:Article a"; $query = $em->createQuery($dql); $paginator = $this->get('knp_paginator'); $pagination = $paginator->paginate( $query, $this->get('request')->query->get('page', 1)/*page number*/, 10/*limit per page*/ );
Ten kod generuje o ile dobrze pamiętam 3 zapytania
1. liczy ile jest rekordów
2. pobiera id rekordów, które mają być pobrane
3. pobiera rekordy, których id zostały pobrane w poprzednim zapytaniu
Dziwi mnie, czemu 2 i 3 zapytanie nie zostały "skumulowane" do jednego.
Gdyby moje zapytanie było bardziej skomplikowane, np. miało jakiegoś join, np taki jak w example:
' SELECT p, c FROM AcmeStoreBundle:Product p JOIN p.category c WHERE p.id = :id'
to pierwsze zapytanie wyglądało by tak:
SELECT count(DISTINCT p) FROM AcmeStoreBundle:Product p JOIN p.category c WHERE p.id = :id'
Co jest niepotrzebne, wystarczy dać samo :
SELECT count(p.id) FROM AcmeStoreBundle:Product p
Bo wynik będzie ten sam, a czas wykonania kilkanaście razy krótszy.
Dlatego ten sposób paginacji odpada.
Czy mogę poprosić was o podsunięcie mi innych pomysłów na paginację ?