Laravel Eloquent — формула haversine и пагинация

Обзор кода

Я создал тему на Обзор кода ветка.

Вопрос

Я использую формулу haversine для подсчета расстояния от выбранного почтового индекса до желаемого пункта назначения.

App \ Models \ Business.php

public function scopeDistance($query, $latitude, $longitude, $radius)
{
$query->getQuery()->orders = [];
return $query->select('*')
->selectRaw("( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) )  * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin(radians(latitude)) ) ) AS distance")
->having('distance', '<=', $radius)
->orderBy('distance');
}

Все выглядит довольно хорошо, за исключением случаев, когда я использую paginate() метод вместо get()

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

Некоторые решения в моем случае вызвали неправильные значения.
Может быть, я сделал что-то не так — не уверен …

Однако я придумала это решение и хотела бы услышать какие-либо отзывы, если это нормально с точки зрения производительности и использования памяти.

function custom_paginator($builder, $per_page)
{
$path = current_route();
$current_page = \Illuminate\Pagination\Paginator::resolveCurrentPage();

if ( ! isset($builder->getQuery()->columns[1])) $count = $builder->count();
else
{
$query = clone $builder->getQuery();
$query->columns = [ $query->columns[1] ];
$query->orders = null;
$count = array_get(\DB::select("select count(*) as count from ({$query->toSql()}) as haversine", $query->getBindings()), 0)->count;
}

return new \Illuminate\Pagination\LengthAwarePaginator(
$builder->forPage($current_page, $per_page)->get(),
$count, $per_page, null, compact('path')
);
}

У меня больше нет идей, как его улучшить, по крайней мере, это работает, и мне не нужно называть что-то вроде

count = count($results = $builder->get());
$items = $results->forPage($curPage, $perPage);

обратная связь действительно ценится.

1

Решение

Вы действительно должны были создать пользовательский пагинатор?

Если нет, попробуйте использовать по умолчанию.

Еще одна вещь, которая мне не понравилась, это необработанные запросы, вы используете laravel, поэтому используйте как можно больше преимуществ.

Вам нужно будет показать действие вашего контроллера для получения дополнительной обратной связи.

Если честно, stackoverflow — не самое лучшее место для этого вопроса,
обмен стеками обзора кода был бы мне более уместным, потому что ваш код уже работает и вы просто хотите улучшить его

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]