2012-03-06 11 views
11

Çok fazla trafik alabilecek bir proje için Doctrine2 kullanıyorum ve bir arama sayfasında bazı sayfalandırma yapmak için sabırsızlanıyorum ve sayfa başına yalnızca 5 sonuç getirme Yani doktrin uzantısını kullanma ve ORM soyutlama katmanını tutma ihtiyacı olmadan bunu yapmak için iyi bir yol var mı? Ben DQL sorguları herhangi bir biçimde yazmak ve bu biçimde kodumu tutmak istemiyorum demek:Doctrine2/Symfony2'de sayfalandırmayı kullanma Doctrine paginator eklentisi olmadan

$repo= $this->getDoctrine() 
        ->getEntityManager() 
        ->getRepository('AcmeOfficeBundle:Project'); 
     $list=$repo->findBy(array('PROJ_private' => "0")); 

cevap

35

Doctrine 2.2 ships with a paginator. Ancak, , DQL sorguları yazmanızı gerektirir.

Herhangi bir DQL yazmamakta ısrar ederseniz, Doctrine EntityRepository sınıfına bakarak başlayabilirsiniz; özellikle, the findBy() method. Eğer (bir temel olarak örnek kullanarak) böyle bir şey denemek, böylece, isteğe bağlı sınırın parametrelerini ve ofset vardır:

$num_pages = x; // some calculation of what page you're currently on 
$repo = $this->getDoctrine() 
       ->getRepository('AcmeOfficeBundle:Project'); 
$list = $repo->findBy(
    array('PROJ_private' => "0"), //search criteria, as usual 
    array(/* orderBy criteria if needed, else empty array */), 
    5, // limit 
    5 * ($num_pages - 1) // offset 
); 
+1

Thx, bunu bilmiyordu. – Matt

+2

Sonuç kümesi için toplam sayfa sayısını nasıl alabilirim? Toplam sonuç sayısını elde etmek için son iki parametre olmadan ayrı bir findBy() çalıştırmalı ve sonra kendim hesaplamalı mıyım? Bu verimsiz görünüyor, ama bunu yapmanın daha zarif bir yolu olup olmadığından emin değilim. – imkingdavid

0

DQL

Pagerfanta

kullanarak koleksiyonları üzerinde işlem etmektir yazma önler iyi bir seçenek Doktrin ORM 2.3 olarak

use Pagerfanta\Adapter\DoctrineCollectionAdapter; 
$user = $em->find("App\DoctrineORM\User", 1); 
$adapter = new DoctrineCollectionAdapter($user->getGroups()); 
0

https://github.com/whiteoctober/Pagerfanta ayrıca varlık depo üzerinde matching birlikte Criteria yararlanabilirler. Şu anda (2,5'ten itibaren) nToMany ilişkileri ile çalışır.

Bu, sorgunuzun başka bir karşılaştırmayı gerektirdiğinde veya başka bir varlığın OneToMany koleksiyonunu belirlerken yardımcı olur.

$page = (isset($_GET['page']) && $_GET['page'] > 0 ? $_GET['page'] : 1); 
$limit = 20; 
$offset = ($limit * ($page - 1)); 
$criteria = \Doctrine\Common\Collections\Criteria::create() 
    ->setMaxResults($limit) 
    ->setFirstResult($offset); 
$expr = $criteria->expr(); 
$user = $em->getRepository('AcmeOfficeBundle:Project') 
    ->matching($criteria->where($expr->gt('PROJ_private', 0))); 
$total_records = $user->count(); 
bir paginator ile Doktrini 2.2 nakliye bölümü için

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections