在Symfony 2中订购分页结果

时间:2018-01-30 10:54:46

标签: php symfony doctrine-orm pagination doctrine-query

我对Symfony 2.7中的分页顺序有疑问。

在我们使用分页之前,我们使用PHP函数来排序一些东西。但我现在的问题是我们怎样才能用与usort相同的顺序在doctrine查询中实现usort。哪个需要与Paginator合作。因为我们现在使用查询(在这里),我们没有得到正确的结果。

usort功能:

mongorestore <filename>

我们如何在以下查询中实现usort:

        usort($result, function ($a, $b) {
        $aBegin = $a->getStartDate() ?: $a->getCreatedDate();
        $bBegin = $b->getStartDate() ?: $b->getCreatedDate();
        if ($aBegin < $bBegin) {
            return -1;
        }
        if ($aBegin == $bBegin) {
            return 0;
        }
        if ($aBegin > $bBegin) {
            return 1;
        }

        return 0;
    });

谢谢!

Doctrine orm:2.2.3, Symfony版本:2.7

1 个答案:

答案 0 :(得分:1)

要添加此类条件,您可以在select子句中使用CASE表达式。您可以编写CASE WHEN b.startDate IS NULL THEN b.createdDate ELSE b.startDate END之类的内容,以获得usort函数中描述的行为。

话虽如此,你不能简单地将它添加到你的order by子句中。您需要选择此值,为其指定别名,然后根据新选择的值添加订单。由于您可能不希望获得mixed result(您的实体将与标量值混合),您可以使用HIDDEN关键字从结果集中删除计算字段。

全部放在一起,它看起来像这样:

// $qb your query builder with all your other parameters
$qb->addSelect('CASE 
    WHEN building.startDate IS NULL 
        THEN building.createdDate 
        ELSE building.startDate
    END 
    AS HIDDEN beginDate');
$qb->orderBy('beginDate', 'DESC');

请注意,虽然这有效,但如果表中有大量条目,则可能会遇到性能问题,因为整个表很可能完全扫描以执行此查询。