Mysql
 sql >> Base de données >  >> RDS >> Mysql

Haversine et Laravel

Vous n'avez donc pas besoin de tout le ballonnement qui se trouve dans cet essentiel, à la place, vous pouvez utiliser les formules suivantes :

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

Cela suppose que vous passiez dans la latitude et longitude de votre utilisateur. De plus, si vous ne voulez pas que le rayon soit 1, vous pouvez passer le 3ème argument et fournir un rayon personnalisé.

Et bien sûr, nous supposons qu'il s'agit d'un modèle d'Offer . Modifiez votre convention de nommage si nécessaire.