Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tính toán khoảng cách tọa độ trong Laravel

Đầu tiên, đừng quên xóa static từ khóa từ lệnh gọi hàm, Laravel đề cập đến tính năng trông tĩnh huyền diệu Profile::distance gọi.

Dưới đây là 2 tùy chọn khác nhau để giải quyết cùng một vấn đề, trong cả hai trường hợp, bạn sẽ gọi \App\Profile::distance($latitude, $longitude, 50) từ bộ điều khiển của bạn.

Tùy chọn 1

Bạn có thể thực hiện phép tính trong bộ nhớ thay vì xử lý các truy vấn con.

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

Tùy chọn 2

Bạn có thể thực thi truy vấn con SQL, đảm bảo kết thúc cuộc gọi bằng 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. SQLException:không thể sử dụng phương thức executeQuery để cập nhật

  2. Chèn danh sách chứa nhiều giá trị trong MySQL bằng pymysql

  3. Làm thế nào để cập nhật một trang web mà không cần tải lại trang web bằng AJAX?

  4. Cách buộc PHP đọc các dòng mới và trả về dưới dạng

  5. Khôi phục cơ sở dữ liệu mysql từ các tệp .frm