2012-03-06 12 views
11

मैं एक ऐसे प्रोजेक्ट के लिए डॉक्टरेट 2 का उपयोग कर रहा हूं जो बहुत अधिक ट्रैफिक प्राप्त कर सकता है और मैं एक खोज पृष्ठ में कुछ पेजिनेशन करने के लिए अच्छा लगा रहा हूं और केवल प्रति पृष्ठ 5 परिणाम प्राप्त करता है तो क्या सिद्धांत विस्तार का उपयोग करने और ओआरएम अबास्ट्रक्शन परत को रखने की आवश्यकता के बिना ऐसा करने का कोई अच्छा तरीका है? मेरा मतलब है मैं DQL प्रश्नों के किसी भी रूप को लिखने और इस प्रारूप में मेरी कोड रखने के लिए नहीं करना चाहती:Doctrine2/Symfony2 में अंकन paginator एक्सटेंशन के बिना पेजिनेशन का उपयोग

$repo= $this->getDoctrine() 
        ->getEntityManager() 
        ->getRepository('AcmeOfficeBundle:Project'); 
     $list=$repo->findBy(array('PROJ_private' => "0")); 

उत्तर

35

सिद्धांत 2.2 ships with a paginator। हालांकि, यह आपको DQL क्वेरी लिखने की आवश्यकता है।

यदि आप किसी भी डीक्यूएल को लिखने का आग्रह नहीं करते हैं, तो आप सिद्धांत EntityRepository कक्षा को देखकर शुरू कर सकते हैं; विशेष रूप से, the findBy() method। यह सीमा के लिए वैकल्पिक पैरामीटर और ऑफसेट है तो आप (एक आधार रेखा के रूप में अपने उदाहरण का उपयोग) कुछ इस तरह की कोशिश कर सकते हैं:

$num_pages = x; // some calculation of what page you're currently on 
$repo = $this->getDoctrine() 
       ->getRepository('AcmeOfficeBundle:Project'); 
$list = $repo->findBy(
    array('PROJ_private' => "0"), //search criteria, as usual 
    array(/* orderBy criteria if needed, else empty array */), 
    5, // limit 
    5 * ($num_pages - 1) // offset 
); 
+1

Thx, कि पता नहीं था। – Matt

+2

परिणाम सेट के लिए पृष्ठों की कुल संख्या मुझे कैसे प्राप्त होगी? क्या मुझे परिणामों की कुल संख्या प्राप्त करने के लिए पिछले दो पैरामीटर के बिना एक अलग खोज() को चलाने की आवश्यकता है और फिर इसे स्वयं गणना करें? यह अक्षम लगता है, लेकिन मुझे यकीन नहीं है कि ऐसा करने का एक और शानदार तरीका है या नहीं। – imkingdavid

0

एक अच्छा विकल्प है कि लेखन DQL Pagerfanta

का उपयोग कर संग्रह पर संचालित करने के लिए है से बचा जाता है https://github.com/whiteoctober/Pagerfanta

use Pagerfanta\Adapter\DoctrineCollectionAdapter; 
$user = $em->find("App\DoctrineORM\User", 1); 
$adapter = new DoctrineCollectionAdapter($user->getGroups()); 
0

सिद्धांत ORM 2.3 में आप भी matching इकाई भंडार पर साथ साथ Criteria उपयोग कर सकते हैं। जो अब (2.5 के रूप में) nToMany रिश्तों के साथ काम करता है।

यह आपकी मदद करता है जब आपकी क्वेरी को बराबर के अलावा किसी अन्य तुलना की आवश्यकता होती है या किसी अन्य इकाई के OneToMany संग्रह को पैगेट करने में सहायता होती है।

$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1); 
$limit = 20; 
$offset = ($limit * ($page - 1)); 
$criteria = \Doctrine\Common\Collections\Criteria::create() 
    ->setMaxResults($limit) 
    ->setFirstResult($offset); 
$expr = $criteria->expr(); 
$user = $em->getRepository('AcmeOfficeBundle:Project') 
    ->matching($criteria->where($expr->gt('PROJ_private', 0))); 
$total_records = $user->count(); 
एक paginator साथ सिद्धांत 2.2 शिपिंग पर भाग के लिए

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections

संबंधित मुद्दे