【发布时间】:2018-01-30 10:54:46
【问题描述】:
我对 Symfony 2.7 中的分页顺序有疑问。
在使用分页之前,我们使用 PHP 函数 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();
谢谢!
教义orm:2.2.3, Symfony 版本:2.7
【问题讨论】:
-
在您的
usort中,您使用$aBegin = $a->getStartDate() ?: $a->getCreatedDate();。因此,如果已设置开始日期,则考虑开始日期,如果未设置,则回退到创建日期。如果数据是一致的,我想你总是有startDate,它比createdDate更新。是这样吗? -
附带说明,如果您希望获得分页结果,为什么要添加带有
id条件的where子句?这样的查询将始终输出 1 或 0 个条目。 -
当getStartDate = null 则需要先按getCreatedDate 排序。否则,只需对 getStartDate 进行排序。管理员接受时,开始日期不为空。
标签: php symfony doctrine-orm pagination doctrine-query