2011-11-22 24 views

Trả lời

38

Bạn cần phải thực hiện DQL để làm điều gì đó mà bạn muốn.

$query = $this->createQueryBuilder() 
       ->from('foo', 'f') 
       ->where('foo.bar = :id') 
       ->setParameter('id', $myID) 
       ->getQuery(); 


$total = $query->select('COUNT(f)') 
       ->getQuery() 
       ->getSingleScalarResult(); 
+5

Đây là giải pháp kém + nó không hoạt động trong Symfony2 mới hơn - sử dụng câu trả lời dưới đây để thay thế. – thorinkor

18

Bạn thực hiện truy vấn rồi nhận kết quả. Khi bạn đã có kết quả, bạn sẽ có được số lượng hồ sơ bằng cách thực hiện một count về kết quả:

$results = $query->getResult(); 
$resultCount = count($results); 

Nếu bạn đang quan tâm đến phân trang, giống như nhận được 25 hồ sơ ra khỏi tổng số. Sau đó, bạn có hai lựa chọn.

  • Bạn thực hiện các truy vấn hai lần, một lần để có được tổng kết quả, thời gian khác để lấy chỉ 25 kết quả bằng cách sử dụng phương pháp setFirstResultsetMaxResults. Phương pháp này setFirstResult cho phép bạn đặt độ lệch và số thứ hai, setMaxResults, số lượng bản ghi. Các mã sau đây sẽ cung cấp cho bạn kết quả khác nhau, từ 25 đến 50, đó là trang thứ hai nếu bạn sử dụng 25 hồ sơ theo trang.

    $query->setFirstResult(25);
    $query->setMaxResults(25);

  • Bạn có thể kiểm tra học thuyết-phần mở rộng cho Doctrine2 có hỗ trợ paginator. Các phần mở rộng này đã được thực hiện bởi một trong những nhà phát triển của Doctrine2. Bạn có thể xem lại các số here này.

Hy vọng trợ giúp này.

Kính trọng,
Matt

+2

@Reuven câu trả lời là một chút tốt hơn, cho phần đếm, bởi vì nó sử dụng các chức năng 'COUNT' nội bộ của người quản lý cơ sở dữ liệu. Nó là tốt hơn bởi vì kết quả không được chuyển giao để có được số lượng. Các bình luận khác của tôi vẫn được áp dụng. – Matt

+0

Cảm ơn. Tôi đoán câu trả lời của tôi là tốt hơn chỉ khi bạn chỉ cần đếm, và không phải là đối tượng. – Reuven

+0

bạn có nghĩa là setFirstResult – jeremymarc

29

Tôi nghĩ rằng bạn có thể làm một cái gì đó như thế:

$query = $this->createQueryBuilder() 
    ->select('COUNT(f.id)') 
    ->from('foo', 'f') 
    ->where('foo.bar = :id') 
    ->setParameter('id', $myID) 
    ->getQuery(); 

$total = $query->getSingleScalarResult(); 
+0

Đây là một câu trả lời tuyệt vời bởi vì tôi nghĩ rằng nó chỉ yêu cầu một truy vấn cơ sở dữ liệu. – Acyra

6

Tôi nghĩ rằng đây là càng ngắn gọn như nó được:

$qb = $repo->createQueryBuilder('entity'); 
$qb->select('COUNT(entity)'); 

$count = $qb->getQuery()->getSingleScalarResult(); 

đâu $repo là loại Doctrine\ORM\EntityRepository

-1

Tại sao không sử dụng chức năng php count()?

Khi học thuyết trả về một mảng chứa tất cả kết quả của bạn, bạn có thể dễ dàng nhận được số hàng trả về theo yêu cầu của bạn.

Đơn giản như vậy:

[...] // Your doctrine query 
$foo = $query->getResult(); 
$nbRow = count($foo); 

đâu $query là biến bạn sử dụng để tạo truy vấn học thuyết của mình.

Liên kết đến tài liệu php: http://php.net/manual/en/function.count.php

+2

Bạn không bao giờ nên tải tất cả dữ liệu nếu bạn chỉ cần đếm. Tốt hơn hãy để DB xử lý việc đếm cho bạn. Nếu tập hợp kết quả lớn thì hiệu suất của bạn sẽ bị ảnh hưởng nặng nề trong khi tất cả những gì bạn cần là kết quả số nguyên. – Koen

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