如何按DQL中的计算值排序

时间:2013-03-06 20:40:04

标签: doctrine-orm dql

我正在尝试通过它们是否与属性上的原始实体匹配来对查询结果进行排序。我可以使用以下查询在mySQL中轻松完成此操作:

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

然而,在Doctrine中,当我尝试以下内容时:

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

我得到一个Doctrine语法错误,'结束字符串'。我研究了创建一个自定义函数,但这看起来有点过分。我对Doctrine很新,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:34)

自Doctrine ORM 2.2起,您可以使用HIDDEN关键字并选择其他字段,在本例中使用CASE表达式:

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

答案 1 :(得分:13)

当我花了一些时间来弄清楚如何使用php语法创建该查询时,这就是我想出的:

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