2012-03-06 26 views
11

Tôi đang sử dụng Doctrine2 cho dự án có thể nhận được nhiều lưu lượng truy cập và tôi đang làm một số trang trong trang tìm kiếm và chỉ tìm nạp 5 kết quả trên mỗi trang Vì vậy, có một cách tốt để làm điều này mà không cần phải sử dụng phần mở rộng học thuyết và giữ lớp trừu tượng ORM? Ý tôi là tôi không muốn viết bất kỳ hình thức truy vấn dql nào và giữ mã của tôi theo định dạng sau:Sử dụng tính năng phân trang trong Doctrine2/Symfony2 mà không cần phần mở rộng Doctrine paginator

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

Trả lời

35

Doctrine 2.2 ships with a paginator. Tuy nhiên, nó không yêu cầu bạn phải ghi các truy vấn DQL.

Nếu bạn nhấn mạnh vào việc không viết bất kỳ DQL nào, bạn có thể bắt đầu bằng cách xem lớp Doctrine EntityRepository; cụ thể, the findBy() method. Nó có các thông số tùy chọn cho giới hạn và bù đắp, vì vậy bạn có thể thử một cái gì đó như thế này (sử dụng ví dụ của bạn làm cơ sở):

$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 cho phần trên thuyết 2.2 vận chuyển với một Paginator, không biết điều đó. – Matt

+2

Tôi làm cách nào để có tổng số trang cho tập hợp kết quả? Tôi có cần chạy hàm findBy() riêng biệt mà không có hai tham số cuối cùng để lấy tổng số kết quả và sau đó tính toán nó không? Điều đó có vẻ không hiệu quả, nhưng tôi không chắc chắn nếu có một cách thanh lịch hơn để làm điều đó. – imkingdavid

0

Một lựa chọn tốt mà tránh viết DQL là để hoạt động trên bộ sưu tập sử dụng Pagerfanta

https://github.com/whiteoctober/Pagerfanta

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

Trong Học thuyết ORM 2.3 bạn cũng có thể sử dụng cùng với Criteriamatching trên kho thực thể. Mà bây giờ (như 2.5) làm việc với các mối quan hệ nToMany.

Điều này giúp khi truy vấn của bạn yêu cầu một so sánh khác với so với hoặc khi phân trang một bộ sưu tập OneToMany của một thực thể khác.

$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(); 

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

Các vấn đề liên quan