【发布时间】:2017-07-24 06:15:37
【问题描述】:
代码审查
我在Code Review 分支上创建了一个主题。
问题
我正在使用半正弦公式来计算从所选邮政编码到所需目的地的距离。
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);
非常感谢您的反馈。
【问题讨论】:
标签: php sql laravel eloquent haversine