sql >> Database >  >> RDS >> Mysql

Bereken de coördinaatafstand in Laravel

Vergeet ten eerste niet de static . te verwijderen trefwoord uit de functie-aanroep, Laravel behandelt magisch statisch ogende Profile::distance bellen.

Hieronder staan ​​2 verschillende opties om hetzelfde probleem op te lossen, in beide gevallen roept u \App\Profile::distance($latitude, $longitude, 50) aan. van je controller.

Optie 1

U kunt de berekening in het geheugen uitvoeren in plaats van met subquery's te werken.

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

Optie 2

U kunt een SQL-subquery uitvoeren, zorg ervoor dat u de aanroep beëindigt met 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. pip install mislukt met /usr/bin/clang:Geen dergelijk bestand of map

  2. Hoe kan ik PDO gebruiken om een ​​resultatenarray in PHP op te halen?

  3. 2 uur toevoegen aan de huidige tijd in MySQL?

  4. Yii2:Kartik Gridview-som van een kolom in voettekst