使用KNPPaginator对计算字段进行分页

时间:2018-11-24 13:31:59

标签: php symfony symfony4 knppaginator

我从包含纬度和经度的学说中获取了“任务”对象,并使用这些值来计算从用户到这些任务的距离。计算出的值不是任务本身的一部分,因为它取决于用户的位置。

$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会破坏对象中的距离。

也许有另一种方法可以向对象添加自定义字段,并使整个表仍可排序?我在寻找任何解决方案/建议

0 个答案:

没有答案