How to order by a computed value in DQL
Asked Answered
M

2

19

I'm trying to order the results of my query by whether or not they match my original entity on a property. I could do this easily in mySQL with the following query:

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

However, in Doctrine, when I attempt the following:

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

I get a Doctrine syntax error, 'end of string'. I looked into creating a custom function, but that seems like overkill. I'm fairly new to Doctrine, is there a better way to do this?

Monetta answered 6/3, 2013 at 20:40 Comment(0)
A
47

Since Doctrine ORM 2.2, you can use the HIDDEN keyword and select additional fields, in this case with a CASE expression:

SELECT
    e,
    CASE WHEN e.prop = :value THEN 1 ELSE 0 END AS HIDDEN sortCondition
FROM
    Entity e
ORDER BY
    sortCondition DESC
Anyplace answered 7/3, 2013 at 10:56 Comment(0)
C
23

As I struggeled a while to figure out how to create that query using php syntax here's what I came up with:

$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');
Cormorant answered 17/5, 2015 at 12:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.