2011-01-28 24 views
5

मैं पिछले कुछ दिनों से डॉक्ट्राइन 2 + जेडएफ सेटअप के साथ खेल रहा हूं।सिद्धांत 2 बड़े संग्रह

उन चीजों में से एक जो मैं अभी भी नहीं समझ सकता, वह बड़ी सरणी संग्रह assosicaitons है। उदाहरण के लिए मान लें कि हमारे पास पोस्ट नामक एक इकाई है और प्रत्येक पोस्ट में कई टिप्पणियां हो सकती हैं।

<?php 
/** 
* @Entity 
*/ 
class Post 
{ 
    /** 
    * @OneToMany(targetEntity="Comment", mappedBy="post") 
    */ 
    protected $comments; 
} 
?> 

अब इस इस विशेष पद के लिए अगर मैं

$post->comments 

लेकिन क्या होगा अगर देखते हैं कर सभी टिप्पणियों लोड होगा, 10000 टिप्पणियां कहा? तब सब लोड हो जाएंगे जो अच्छा नहीं है। और जहां तक ​​मुझे पता है कि स्लाइस/पेजिनेशन सिद्धांत 2.1 तक उपलब्ध नहीं होगा।

क्या कोई मुझे सलाह दे सकता है कि मैं टिप्पणियों को कैसे सीमित कर सकता हूं? शायद डीक्यूएल के साथ? यदि डीक्यूएल, आप इसे कहां कार्यान्वित करते हैं? क्या मैं पोस्ट इकाई में getComments विधि बनाता हूं और वहां डीक्यूएल करता हूं?

धन्यवाद विधेयक

उत्तर

10

मैं https://github.com/beberlei/DoctrineExtensions से पृष्ठांकन उपयोग कर रहा हूँ, यह बहुत अच्छा काम करता है, कम से कम मेरे लिए।

संपादित: सुनिश्चित नहीं यह आप में मदद मिलेगी, लेकिन यहाँ मैं अपने पृष्ठांकन किया

नियंत्रक

// Create the query 
$qb = $this->_em->createQueryBuilder(); 

$qb->select('p') 
    ->from('Identiti_Entities_Pengguna', 'p'); 

// Sorting 
$qb->addOrderBy('p.' . $input->sort, $input->dir); 

$q = $qb->getQuery(); 

// Pagination 
$itemPerPage = 100; 

$records = new Zend_Paginator(
       new DoctrineExtensions\Paginate\PaginationAdapter($q)); 

$records->setCurrentPageNumber($input->page) 
     ->setItemCountPerPage($itemPerPage) 
     ->setPageRange(10); 

$this->view->records = $records; 

देखें

<? 
echo $this->paginationControl($this->records, 
           'Sliding', 
           'partials/pagination.phtml'); 
?> 

pagination.html है

<?php if ($this->pageCount): ?> 
<ul id="pagination-digg"> 
    <li class="previous"><a href="#">Pages: <?=$this->pageCount?></a></li> 
<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
    <li class="previous"><a href="<?php echo $this->url(array('page' => $this->previous)); ?>"> 
    &lt; Previous 
    </a></li> 
<?php else: ?> 
    <li class="previous-off">&lt; Previous</li> 
<?php endif; ?> 


<!-- Numbered page links --> 
<?php foreach ($this->pagesInRange as $page): ?> 
    <?php if ($page != $this->current): ?> 
     <li> 
      <a href="<?php echo $this->url(array('page' => $page)); ?>"> 
       <?php echo $page; ?> 
      </a> 
     </li> 
    <?php else: ?> 
     <li class="active"><?php echo $page; ?></li> 
    <?php endif; ?> 
<?php endforeach; ?> 

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
    <li class="next"> 
     <a href="<?php echo $this->url(array('page' => $this->next)); ?>"> 
      Next &gt; 
     </a> 
    </li> 
<?php else: ?> 
    <li class="next-off">Next &gt;</li> 
<?php endif; ?> 
</ul> 
<?php endif; ?> 
+1

पेजिनेट एक्सटेंशन के बगल में लार्जकोलेक्शन नामक एक एक्सटेंशन भी है। – Orhan

+1

तब आप पेजिनेशन कोड का उपयोग कब करेंगे। $ Post-> getComments() में? क्या हम इकाई में डीक्यूएल का उपयोग कर सकते हैं? या शायद एक सेवा में? क्या आप एक कोड उदाहरण दे सकते हैं? @orhan एक ही मुद्दा, आप बड़े चयन एक्सटेंशन का उपयोग कहां करेंगे? – Optimus

+0

लार्जकोलेक्शन ने मेरे लिए चाल बनाई! मैंने अपनी 'पोस्ट' इकाई में निम्न विधि जोड़ा।'सार्वजनिक फ़ंक्शन getCommentsPagination ($ सीमा = 10, $ ऑफ़सेट = 0) { $ lc = new \ DoctrineExtensions \ LargeCollections \ LargeCollection(); $ परिणाम = $ एलसी-> getSliceQuery ($ this-> getComments(), $ सीमा, $ ऑफसेट) -> getResult(); $ परिणाम वापसी; } ' – Optimus

1

आप Zend_Paginator_Adapter_Interface लागू करने पर विचार कर सकते हैं।

अधिक जानकारी के लिए जेडएफ डॉक्स देखें:

+0

मैं इस ज़ेंड तरीके से नहीं करना चाहता हूं। मैं इस डीडीडी/डॉक्टर 2 तरीके को पूरा करने की कोशिश कर रहा हूं :) – Optimus

+1

@boosis - ज़ेंड और डीडीडी पारस्परिक रूप से अनन्य नहीं हैं, क्या आप अपनी टिप्पणी समझा सकते हैं? – jsuggs

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