sql >> Databasteknik >  >> RDS >> Mysql

Haversine och Laravel

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.



  1. Det renaste sättet att bygga en SQL-sträng i Java

  2. JavaFX MySQL-anslutningsexempel tack

  3. Varför förbrukar iteration genom en stor Django QuerySet enorma mängder minne?

  4. mysql tinyint(1) vs tinyint(2) vs tinyint(3) vs tinyint(4)