Så du behöver inte all uppblåsthet som finns i den kärnan, istället kan du använda följande formler:
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;
}
Detta förutsätter att du passerar i latitude
och longitude
från din användare. Dessutom, om du inte vill att radien ska vara 1, kan du skicka in det tredje argumentet och ange en anpassad radie.
Och naturligtvis antar vi att detta är för en modell av Offer
. Ändra din namnkonvention vid behov.