sql >> Database teknologi >  >> RDS >> Mysql

Beregn koordinatafstand i Laravel

For det første, glem ikke at fjerne den static nøgleord fra funktionskaldet, beskæftiger Laravel sig med magisk statisk udseende Profile::distance ring.

Nedenfor er 2 forskellige muligheder for at løse det samme problem, i begge tilfælde vil du kalde \App\Profile::distance($latitude, $longitude, 50) fra din controller.

Mulighed 1

Du kan lave beregningen i hukommelsen i stedet for at håndtere underforespørgsler.

public function scopeDistance($query, $lat, $long, $distance) {
    return Profile::all()->filter(function ($profile) use ($lat, $long, $distance) {
        $actual = 3959 * acos(
            cos(deg2rad($lat)) * cos(deg2rad($profile->latitude))
            * cos(deg2rad($profile->longitude) - deg2rad($long))
            + sin(deg2rad($lat)) * sin(deg2rad($profile->latitude))
        );
        return $distance < $actual;
    });
}

Mulighed 2

Du kan udføre en SQL-underforespørgsel, sørg for at afslutte opkaldet med get() :

public function scopeDistance($query, $lat, $long, $distance) {
    return $query->having('distance', '<', $distance)
             ->select(DB::raw("*,
                     (3959 * ACOS(COS(RADIANS($lat))
                           * COS(RADIANS(latitude))
                           * COS(RADIANS($long) - RADIANS(longitude))
                           + SIN(RADIANS($lat))
                           * SIN(RADIANS(latitude)))) AS distance")
             )->orderBy('distance', 'asc')
              ->get();
}



  1. Er det muligt at sammenkæde strenge fra flere rækker og tabeller i en resultatkolonne?

  2. Opdater en række, men indsæt, hvis rækken ikke findes i kodetænder

  3. MySql-databasedesign til et quizprogram

  4. Hvordan kalder man en PROCEDURE i MySQL?