2013-03-06 23 views
8

Próbuję zamówić wyniki mojego zapytania, niezależnie od tego, czy pasują one do mojej pierwotnej jednostki w usłudze. Mogłem to zrobić łatwo w MySQL z następującym zapytaniem:Jak zamówić przez obliczoną wartość w DQL

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

Jednakże w doktrynie, kiedy próbuję następujący:

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

otrzymuję błąd składni doktryny „koniec sznurka”. Przyjrzałem się tworzeniu niestandardowej funkcji, ale wydaje się to przesadą. Jestem całkiem nowy w Doctrine, czy jest lepszy sposób na zrobienie tego?

Odpowiedz

22

Od Doctrine ORM 2.2, można użyć słowa kluczowego HIDDEN i wybierz dodatkowe pola, w tym przypadku z wyrażeniem CASE:

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

To działało idealnie! Dzięki! – SnailCoil

11

Jak struggeled trochę czasu, aby dowiedzieć się, jak stworzyć tego zapytania za pomocą PHP Składnia Oto co wymyśliłem:

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