Mysql
 sql >> база данни >  >> RDS >> Mysql

Изчислете координатното разстояние в Laravel

Първо, не забравяйте да премахнете static ключова дума от извикването на функцията, Laravel се занимава с магически статичен вид Profile::distance обадете се.

По-долу са 2 различни опции за решаване на един и същ проблем, и в двата случая ще извикате \App\Profile::distance($latitude, $longitude, 50) от вашия контролер.

Опция 1

Можете да правите изчисленията в паметта, вместо да се занимавате с подзаявки.

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

Вариант 2

Можете да изпълните SQL подзаявка, не забравяйте да прекратите повикването с 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP - Забележка:Недефиниран индекс:

  2. Mysql търсене на низ и число с помощта на MATCH() AGAINST()

  3. Сортирайте променливите $_POST

  4. Свържете две таблици с всички записи

  5. Как да избера MySQL база данни за използване с PDO в PHP?