我对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
答案 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');
请注意,虽然这有效,但如果表中有大量条目,则可能会遇到性能问题,因为整个表很可能完全扫描以执行此查询。