我对Symfony 2.7中的分页顺序有疑问。
在使用分页之前,我们使用PHP函数usort对一些东西进行排序。但我现在的问题是,我们如何才能在教义查询中以与 usort 相同的顺序实现 usort。这需要与分页器一起工作。因为当我们现在使用查询(下面(时,我们没有得到正确的结果。
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;
});
我们如何在以下查询中实现 usort:
$build = $this->createQueryBuilder('building');
$build
->addSelect('users', 'furniture')
->join('building.users', 'users')
->leftJoin('building.furniture', 'furniture')
->where('building.id = :id')
->setParameter('id', $id)
->orderBy('building.getStartDate', 'ASC')
->addOrderBy('building.getCreatedDate', 'DESC');
$paginator = new Paginator($build->getQuery(), $fetchJoinCollection = true);
$result = $paginator->getQuery()
->setFirstResult($offset)
->setMaxResults($limit)
->getResult();
谢谢!
学说或:2.2.3,符号版本:2.7
若要添加此类条件,可以在 select 子句中使用 CASE
表达式。您可以编写类似 CASE WHEN b.startDate IS NULL THEN b.createdDate ELSE b.startDate END
的东西,以便在 usort
函数中描述行为。
话虽如此,您不能简单地将其添加到子句的订单中。您需要选择此值,为其指定别名,然后根据新选择的值添加订单。由于您可能不希望获得混合结果(其中实体将与标量值混合(,因此可以使用 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');
请注意,虽然这有效,但如果表中有很多条目,则可能会遇到性能问题,因为很可能完全扫描整个表以执行此查询。