Search code examples
doctrine-ormdql

How to order by a computed value in DQL


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?


Solution

  • 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