哈弗辛和拉拉维尔



我正在尝试通过距离参数(以英里为单位(将用户位置(通过URL中的参数发送(与offers.offer_lat和offers.offer_long(在我的数据库中(进行比较

我现在快疯了,我在网上找到的许多解决方案都证明很难使用 DB::raw 移植到 laravels 查询构建器,我目前在查询范围内有该功能,因为用户将使用距离过滤 API 结果,不过运气不好!

我在网上找到了一些用于计算哈弗正弦的函数,但我不知道如何使用它们。下面是一个示例:https://gist.github.com/fhferreira/9081607

任何帮助将不胜感激! :)

谢谢

因此,您不需要该要点中的所有膨胀,而是可以使用以下公式:

public function get_offers_near($latitude, $longitude, $radius = 1){
    $offers = Offer::select('offers.*')
        ->selectRaw('( 3959 * acos( cos( radians(?) ) *
                           cos( radians( offer_lat ) )
                           * cos( radians( offer_long ) - radians(?)
                           ) + sin( radians(?) ) *
                           sin( radians( offer_lat ) ) )
                         ) AS distance', [$latitude, $longitude, $latitude])
        ->havingRaw("distance < ?", [$radius])
        ->get();
    return $offers;
}

这假定您从用户传入latitudelongitude。此外,如果您不希望半径为 1,则可以传入第三个参数并提供自定义半径。

当然,我们假设这是针对Offer模型的。根据需要更改命名约定。

Laravel中的Haversine是这样工作的:

                Travel::select(
                    DB::raw("travels.*,
                          ( 6371 * acos( cos( radians($lat) ) *
                            cos( radians( lat ) )
                            * cos( radians( lon ) - radians($lng)
                            ) + sin( radians($lat) ) *
                            sin( radians( lat ) ) )
                          ) AS distance"))
                ->orderBy('distance', 'asc')
                ->get();

您将获得按距离排序的点集合(最接近的在前(

使用参数纬度和液化天然气的行程模型。 参数距离由原始查询添加

最新更新