Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hitung jarak koordinat di Laravel

Pertama, jangan lupa untuk menghapus static kata kunci dari pemanggilan fungsi, Laravel berurusan dengan terlihat statis ajaib Profile::distance panggilan.

Di bawah ini adalah 2 opsi berbeda untuk menyelesaikan masalah yang sama, dalam kedua kasus tersebut Anda akan memanggil \App\Profile::distance($latitude, $longitude, 50) dari pengontrol Anda.

Opsi 1

Anda dapat melakukan perhitungan dalam memori alih-alih berurusan dengan subquery.

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

Opsi 2

Anda dapat menjalankan subquery SQL, pastikan untuk mengakhiri panggilan dengan 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. Cara Mendapatkan Setiap Baris Ke-N di MySQL

  2. Dapatkan respons Spesifik dari MySql di jQuery AJAX Success

  3. filter replikasi mysql (abaikan-db)

  4. Cara Mendapatkan Catatan dari 10 Menit Terakhir di MySQL

  5. Atas permintaan pagination (Catatan paginasi sesuai permintaan pengguna)