Exo*_*osh 2 php mysql haversine laravel
我试图通过距离参数(以英里为单位)将用户位置(通过URL中的params发送)与offers.offer_lat和offers.offer_long(在我的数据库中)进行比较
我现在发疯了,我在网上找到的很多解决方案很难通过DB :: raw移植到laravels查询构建器,我目前在查询范围内有函数,因为用户将使用过滤API结果距离,但没有运气!
我在网上发现了一些用于计算hasrsine的函数,但我不知道如何使用它们.这是一个例子:https: //gist.github.com/fhferreira/9081607
任何帮助都将受到大力赞赏!:)
谢谢
因此,您不需要该gist中的所有膨胀,而是可以使用以下公式:
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;
}
Run Code Online (Sandbox Code Playgroud)
这假定您传入latitude和传出longitude用户.此外,如果您不希望半径为1,则可以传入第三个参数并提供自定义半径.
当然,我们假设这是一个模型Offer.根据需要更改命名约定.