5 Stimmen

Doctrine2 große Sammlungen

Ich habe mit doctrine2 + ZF Setup für die letzten paar Tage gespielt.

Eines der Dinge, die ich immer noch nicht verstehe, ist die große Anzahl von Assoziationen in der Sammlung. Nehmen wir zum Beispiel an, wir haben eine Entität namens Post und jeder Post kann viele Kommentare haben.

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

Jetzt werden alle Kommentare geladen, wenn ich

$post->comments

Aber was ist, wenn es, sagen wir, 10000 Kommentare zu diesem bestimmten Beitrag gibt? Dann werden alle geladen, was nicht gut ist. Und soweit ich weiß, werden Slice/Pagination erst ab Doktrin 2.1 verfügbar sein.

Kann mir jemand sagen, wie ich Kommentare paginieren kann? Mit DQL vielleicht? wenn DQL, wo Sie dies implementieren? erstelle ich eine getComments-Methode in der Post-Entität und tun die DQL dort?

Danke Bill

10voto

Amree Punkte 2850

Ich verwende die Paginierung von https://github.com/beberlei/DoctrineExtensions funktioniert es hervorragend, zumindest bei mir.

bearbeiten : Ich weiß nicht, ob das für Sie hilfreich ist, aber so habe ich meine Paginierung gemacht

Controller

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

Siehe

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

1voto

takeshin Punkte 46602

Sie können folgende Maßnahmen in Betracht ziehen Zend_Paginator_Adapter_Interface .

Siehe ZF-Dokumente für weitere Details:

0voto

Kurt Krueckeberg Punkte 1227

Doctrine 2.2 hat jetzt eine Paginator Klasse. Siehe diesen Link für die Verwendung mit Zend_Framework: Antwort auf Wie man D2's Paginator mit Zend_Paginator verwendet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X