Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Haversine e Laravel


Então você não precisa de todo o inchaço que está nessa essência, em vez disso, você pode usar as seguintes fórmulas:
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;
}

Isso pressupõe que você transmita a latitude e longitude do seu usuário. Além disso, se você não quiser que o raio seja 1, você pode passar o terceiro argumento e fornecer um raio personalizado.

E, claro, estamos assumindo que isso é para um modelo de Offer . Altere sua convenção de nomenclatura quando necessário.