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

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

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

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

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

$post->comments

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

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

Спасибо Билл


person Optimus    schedule 28.01.2011    source источник


Ответы (3)


Я использую разбиение на страницы из 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');
?>

разбиение на страницы.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; ?>
person Amree    schedule 29.01.2011
comment
Существует также расширение под названием LargeCollections, помимо расширения Paginate. - person Orhan Saglam; 29.01.2011
comment
где бы вы тогда использовали код разбиения на страницы. В $post-›getComments()? Можем ли мы использовать DQL в сущности? а может в сервисе? можешь привести пример кода? @orhan такая же проблема, где бы вы использовали расширение LargeCollection? - person Optimus; 29.01.2011
comment
LargeCollections помогли мне! Я добавил следующий метод к моей сущности Post.public function getCommentsPagination($limit = 10, $offset = 0) { $lc = new \DoctrineExtensions\LargeCollections\LargeCollection(); $result = $lc->getSliceQuery($this->getComments(), $limit, $offset)->getResult(); return $result; } - person Optimus; 30.01.2011
comment
Извините за форматирование. Я не нашел здесь, как форматировать комментарии. - person Optimus; 30.01.2011
comment
Но правильно ли добавлять такую ​​зависимость в Entity, которая должна быть свободной от уровня постоянства? - person JohnT; 11.06.2011
comment
Я пытался использовать этот образец кода, но то, как мы используем в этом примере метод partialLoop, не позволяет мне печатать данные. я использую echo $this-›partialLoop('index/table-row.phtml',$this-›records); и создайте table-row.phtml и в этом файле я ‹?php echo $this-›id; ?› но он печатает пустым, - person ulduz114; 11.09.2011

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

См. документы ZF для более подробной информации:

person takeshin    schedule 28.01.2011
comment
Я не хочу делать это в духе Zend. Я пытаюсь выполнить этот способ DDD/Doctrine2 :) - person Optimus; 29.01.2011
comment
@boosis - Zend и DDD не исключают друг друга, можете ли вы объяснить свой комментарий? - person jsuggs; 31.01.2011

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

person Kurt Krueckeberg    schedule 17.02.2012