2011-01-28 9 views
5

He estado jugando con la configuración doctrine2 + ZF durante los últimos días.Grandes colecciones de Doctrine2

Una de las cosas que todavía no puedo descifrar es la gran colección de colecciones assosicaitons. Por ejemplo, digamos que tenemos una entidad llamada Publicación y cada publicación puede tener muchos comentarios.

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

Ahora bien, esto cargará todos los comentarios si lo hago

$post->comments 

Pero lo que si hay, digamos 10000 comentarios de este post en particular? Entonces todo será cargado, lo cual no es bueno. Y hasta donde sé, la división/paginación no estará disponible hasta la doctrina 2.1.

¿Alguien me puede aconsejar cómo puedo paginar los comentarios? Con DQL tal vez? si DQL, ¿dónde implementa esto? ¿Creo un método getComments en la entidad Post y hago el DQL allí?

Gracias Bill

Respuesta

10

estoy usando la paginación de https://github.com/beberlei/DoctrineExtensions, funciona muy bien, al menos para mí.

Editar: No estoy seguro que esto le ayudará, pero aquí es como hice mi paginación

controlador

// 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; 

Ver

<? 
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

También hay una extensión llamada LargeCollections junto a la extensión Paginate. – Orhan

+1

donde usarías el código de paginación entonces. En $ post-> getComments()? ¿Podemos usar DQL en la entidad? o tal vez en un servicio? ¿Puedes dar un ejemplo de código? @orhan mismo problema, ¿dónde utilizarías la extensión LargeCollection? – Optimus

+0

¡LargeCollections hizo el truco para mí! Agregué el siguiente método a mi entidad 'Post'.'public function getCommentsPagination ($ limit = 10, $ offset = 0) { $ lc = new \ DoctrineExtensions \ LargeCollections \ LargeCollection(); $ result = $ lc-> getSliceQuery ($ this-> getComments(), $ limit, $ offset) -> getResult(); return $ result; } ' – Optimus