Я получаю «Задачи» моих объектов из доктрины, которые содержат широту и долготу, и я использую это значение для вычисления расстояния от пользователя до этих задач.Вычисленное значение не является частью самих Задач, потому что оно зависит от местоположения пользователя.
$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, с другой стороны, приведет к разрыву с расстоянием в объекте.
Может быть, существует другой подход к добавлению настраиваемого поля к объекту и сохранению возможности сортировки всей таблицы?Я ищу любые решения / предложения