2013-03-06 32 views
8

Tôi đang cố gắng sắp xếp kết quả truy vấn của mình bằng cách cho dù chúng có khớp với thực thể gốc của tôi trên thuộc tính hay không. Tôi có thể làm điều này một cách dễ dàng trong mySQL với truy vấn sau đây:Cách đặt hàng bằng giá trị được tính trong DQL

SELECT * FROM table 
ORDER BY prop = 'value' DESC; 

Tuy nhiên, trong Doctrine, khi tôi cố gắng như sau:

// $qb is an instance of query builder 
$qb->select('e') 
    ->from('Entity', 'e') 
    ->orderBy('e.prop = :value', 'DESC') 
    ->setParameter('value', 'value'); 
// grab values 

tôi nhận được một lỗi cú pháp Doctrine, 'kết thúc chuỗi'. Tôi nhìn vào việc tạo ra một chức năng tùy chỉnh, nhưng điều đó có vẻ như quá mức cần thiết. Tôi khá mới với Doctrine, có cách nào tốt hơn để làm điều này không?

Trả lời

22

Kể từ Học thuyết ORM 2.2, bạn có thể sử dụng từ khóa HIDDEN và chọn trường bổ sung, trong trường hợp này với một biểu thức CASE:

SELECT 
    e, 
    CASE WHEN e.prop = :value THEN 1 ELSE 0 END AS HIDDEN sortCondition 
FROM 
    Entity e 
ORDER BY 
    sortCondition DESC 
+0

Điều này làm việc hoàn hảo! Cảm ơn! – SnailCoil

11

Như tôi struggeled một thời gian để tìm ra cách để tạo truy vấn sử dụng php cú pháp dưới đây là những gì tôi đã đưa ra:

$value = 'my-value';  
$qb->select('e') 
    ->from('Entity', 'e') 
    ->addSelect('CASE WHEN e.prop = :value THEN 1 ELSE 0 END AS HIDDEN sortCondition') 
    ->setParameter('value', $value) 
    ->addOrderBy('sortCondition', 'DESC'); 
Các vấn đề liên quan