2011-11-18 24 views
6

Có ai biết cách truy xuất số đếm dựa trên điều kiện trong câu lệnh chọn Query() của Doctrine 2 không?Học thuyết 2: Đếm các mục bằng cách nhập vào Chọn

Đây là những gì tôi đã thử cho đến nay ...

Lần thử đầu tiên của tôi là thử đếm() với eq(). Các lỗi tôi nhận được nói "Dự kiến ​​đóng ngoặc đơn, có bằng."

$qb->select($qb->expr()->count($qb->expr()->eq('t.id', '1'))) 

Tiếp theo tôi đã thử đếm() bằng(). Lỗi tôi nhận được nói "Đã đạt đến mức lồng hàm tối đa."

$qb->select($qb->expr()->count($qb->having('t.id', '1'))) 

Sau đó, tôi đã thử đếm() với vị trí() và eq(). Một lần nữa, tôi đã đạt được "Mức lồng hàm tối đa."

$qb->select($qb->expr()->count($qb->where($qb->expr()->eq('t.id', '1')))) 

Sau đó, tôi đã thử các biến thể này bằng cách sử dụng trong(). Cả hai đều cung cấp cho các lỗi cú pháp "mong đợi từ, có ví dụ '('

$qb->select($qb->expr()->count($qb->expr()->in('t.id', array(1)))) 
$qb->select($qb->expr()->count($qb->expr()->in('t.id', 1))) 

Đối với trong(), tôi cũng đã cố gắng đi trong giá trị như là một biến và qua setParameter(), với kết quả tương tự.

Dưới đây là tương đương với MySQL về những gì tôi đang cố gắng để mã trong QueryBuilder:

SELECT 
    SUM(IF(type.id = 1, 1, 0)) AS 'fords', 
    SUM(IF(type.id = 2, 1, 0)) AS 'hondas' 
FROM item 
JOIN type ON item.type_id = type.id 
+4

Đừng quên, mà bạn có thể sử dụng Truy vấn gốc. Đôi khi nó nhanh hơn và thanh lịch hơn. –

Trả lời

6

Trừ nếu bạn cần phải ở lại với điều DQL, điều này có thể giúp:

public function MyAction() { 

    $this->doctrineContainer = Zend_Registry::get('doctrine'); 
    $em = $this->doctrineContainer->getEntityManager(); 

    $fords = $em->getRepository('My\Entity\Item')->findBy(array('type' => '1')); 
    $hondas = $em->getRepository('My\Entity\Item')->findBy(array('type' => '2')); 

    $fordQty = count($fords); 
    $hondaQty = count($hondas); 

} 

Một số thông tin chi tiết tại địa chỉ: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#by-simple-conditions

+0

Cảm ơn Froger - Tôi đã kết thúc bằng cách viết một truy vấn gốc, nhưng chắc chắn điều này cũng có ích. – cantera

+1

@cantera Sẽ rất vui khi chia sẻ với chúng tôi truy vấn gốc có thể hữu ích cho những người có cùng vấn đề. –

2

Sử dụng trình tạo truy vấn:

$query = $respository 
     ->createQueryBuilder('u') 
     ->select('count(u)') 
     ->getQuery() 
; 

$total = $query->getSingleResult(); 

:)

2

Sử dụng QueryBuilder, hãy thử:

$qb->select(" SUM(CASE WHEN t.id = 1 THEN 1 ELSE 0 END) as fords ") 
->addSelect(" SUM(CASE WHEN t.id = 2 THEN 1 ELSE 0 END) as hondas ") 
Các vấn đề liên quan