我正在尝试通过距离参数(以英里为单位(将用户位置(通过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;
}
这假定您从用户传入latitude
和longitude
。此外,如果您不希望半径为 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();
您将获得按距离排序的点集合(最接近的在前(
使用参数纬度和液化天然气的行程模型。 参数距离由原始查询添加