我试图通过一个距离参数(以英里为单位)将用户位置(通过URL中的params发送)与offers.offer_lat和offers.offer_long (在我的DB中)进行比较。
我现在快疯了,我在网上找到的很多解决方案都很难移植到使用DB::raw的大型查询生成器,我目前在查询范围内有这个函数,因为用户将使用距离过滤API结果,但是没有运气!
我在网上找到了一些函数,可以计算出这些函数,但我不知道如何使用它们。下面是一个例子:https://gist.github.com/fhferreira/9081607
如有任何帮助,将不胜感激!:)
谢谢
发布于 2016-02-17 21:22:36
因此,您不需要在该要点中的所有膨胀,相反,您可以使用以下公式:
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模型。在需要时更改命名约定。
发布于 2019-05-24 20:51:43
拉拉维尔的哈弗森就是这样工作的:
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();你将得到一个按距离排序的点数集合(最近的第一个)。
采用带params、lat和lng的旅行模型。参数距离由原始查询添加。
https://stackoverflow.com/questions/35467774
复制相似问题