Пагинация с рассчитанным полем с использованием KNPPaginator - PullRequest
0 голосов
/ 24 ноября 2018

Я получаю «Задачи» моих объектов из доктрины, которые содержат широту и долготу, и я использую это значение для вычисления расстояния от пользователя до этих задач.Вычисленное значение не является частью самих Задач, потому что оно зависит от местоположения пользователя.

$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, с другой стороны, приведет к разрыву с расстоянием в объекте.

Может быть, существует другой подход к добавлению настраиваемого поля к объекту и сохранению возможности сортировки всей таблицы?Я ищу любые решения / предложения

...