Doctrine2 большие коллекции - PullRequest
       10

Doctrine2 большие коллекции

5 голосов
/ 29 января 2011

Последние пару дней я играл с настройкой doctrine2 + ZF.

Одна из вещей, которую я до сих пор не могу понять, - это наборы больших массивов. Например, допустим, у нас есть объект с именем Post, и у каждого сообщения может быть много комментариев.

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

Теперь это загрузит все комментарии, если я сделаю

$post->comments

Но что, если есть, скажем, 10000 комментариев к этому конкретному сообщению? Тогда все будет загружено, что не хорошо. И насколько я знаю, ломтик / нумерация страниц не будут доступны до доктрины 2.1.

Может кто-нибудь посоветовать мне, как я могу разбить комментарии на страницы? С DQL может быть? если DQL, где вы это реализуете? я создаю метод getComments в сущности Post и выполняю там DQL?

Спасибо Билл

Ответы [ 3 ]

10 голосов
/ 29 января 2011

Я использую нумерацию страниц из 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 голос
/ 29 января 2011

Вы можете рассмотреть возможность реализации Zend_Paginator_Adapter_Interface.

Подробнее см. В документации ZF:

0 голосов
/ 17 февраля 2012

Doctrine 2.2 теперь имеет класс Paginator. Смотрите эту ссылку, чтобы узнать, как использовать его с Zend_Framework: Ответить на Как использовать D2's Paginator с Zend_Paginator

...