sql >> Databáze >  >> RDS >> Mysql

Haversine a Laravel

Takže nepotřebujete všechnu tu nabubřelost, která je v té podstatě, místo toho můžete použít následující vzorce:

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

To předpokládá, že zadáte latitude a longitude od vašeho uživatele. Pokud také nechcete, aby byl poloměr 1, můžete zadat 3. argument a zadat vlastní poloměr.

A samozřejmě předpokládáme, že se jedná o model Offer . V případě potřeby změňte konvenci pojmenování.



  1. Mysql zlepšuje rychlost SELECT

  2. Porovnání datových úložišť pro PostgreSQL - MVCC vs InnoDB

  3. 5 úloh, které vyžadují Microsoft Access

  4. Jak přepsat IS DISTINCT FROM a IS NOT DISTINCT FROM?