我从包含纬度和经度的学说中获取了“任务”对象,并使用这些值来计算从用户到这些任务的距离。计算出的值不是任务本身的一部分,因为它取决于用户的位置。
$tasksQ = $entityManager->createQueryBuilder()
->select('p')
->from('App\Entity\Task', 'p');
$tasksQ->orderBy('p.id', 'DESC');
$tasksQ
->addSelect(
'( 6371 * acos(cos(radians(' . $lat . '))' .
'* cos( radians( p.lat ) )' .
'* cos( radians( p.lng )' .
'- radians(' . $lng . ') )' .
'+ sin( radians(' . $lat . ') )' .
'* sin( radians( p.lat ) ) ) ) as distance'
)
->having('distance < :distance')
->setParameter('distance', $radius)
->orderBy('distance', 'ASC');
这是我的分页者:
/* @var $paginator \Knp\Component\Pager\Paginator */
$paginator = $this->get('knp_paginator');
$tasks = $paginator->paginate(
$tasksQ->getQuery()->getArrayResult(),
$request->query->getInt('page', 1), // Which page to open by default
10, // 10 results per page
array('wrap-queries' => true));
if ($radius != null) {
foreach ($tasks as $key => $value) {
$tab = $tasks[$key][0];
$tab['distance'] = $tasks[$key]['distance'];
$tasks[$key] = $tab;
}
}
树枝:
<th>{{ knp_pagination_sortable(tasks, 'Id', 'p.id') }}</th>
<th>{{ knp_pagination_sortable(tasks, 'Status', 'p.opened') }}</th>
<th>{{ knp_pagination_sortable(tasks, 'Type', 'p.type') }}</th>
<th>{{ knp_pagination_sortable(tasks, 'Skills required', 'p.skillsReq') }}</th>
<th>{{ knp_pagination_sortable(tasks, 'Reward', 'p.credit') }}</th>
<th>{{ knp_pagination_sortable(tasks, 'Location', 'p.town') }}</th>
{% if tasks[0].distance is defined %}
<th>Distance (km)</th>
{% endif %}
由于getArrayResult(),分页不起作用,KNPpaginator需要纯对象,因此Task对象中不包含距离。另一方面,删除getArrayResult会破坏对象中的距离。
也许有另一种方法可以向对象添加自定义字段,并使整个表仍可排序?我在寻找任何解决方案/建议