订单分页结果在 Symfony 2 中



我对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');

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

相关内容

  • 没有找到相关文章

最新更新