Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Haversine und Laravel

Sie brauchen also nicht die ganze Aufblähung, die in diesem Kern steckt, sondern können stattdessen die folgenden Formeln verwenden:

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;
}

Dies setzt voraus, dass Sie den latitude übergeben und longitude von Ihrem Benutzer. Wenn Sie nicht möchten, dass der Radius 1 ist, können Sie das dritte Argument übergeben und einen benutzerdefinierten Radius angeben.

Und natürlich gehen wir davon aus, dass es sich um ein Offer-Modell handelt . Ändern Sie bei Bedarf Ihre Namenskonvention.