Đây là cách tôi thực hiện nó. Tôi đã chọn đặt biệt danh cho truy vấn của mình trước thời hạn, bằng cách này, tôi có thể tận dụng lợi thế của Pagination
. Hơn nữa, bạn cần phải chọn rõ ràng các cột mà bạn muốn lấy từ truy vấn. thêm chúng tại ->select()
. Chẳng hạn như users.latitude, users.longitude, products.name
hoặc bất cứ điều gì chúng có thể là.
Tôi đã tạo một phạm vi trông giống như sau:
public function scopeIsWithinMaxDistance($query, $location, $radius = 25) {
$haversine = "(6371 * acos(cos(radians($location->latitude))
* cos(radians(model.latitude))
* cos(radians(model.longitude)
- radians($location->longitude))
+ sin(radians($location->latitude))
* sin(radians(model.latitude))))";
return $query
->select() //pick the columns you want here.
->selectRaw("{$haversine} AS distance")
->whereRaw("{$haversine} < ?", [$radius]);
}
Bạn có thể áp dụng phạm vi này cho bất kỳ mô hình nào có latitude
và longitude
.
Thay thế $location->latitude
với latitude
của bạn mà bạn muốn tìm kiếm và thay thế $location->longitude
với kinh độ mà bạn muốn tìm kiếm.
Thay thế model.latitude
và model.longitude
với các Mô hình bạn muốn tìm xung quanh $location
dựa trên khoảng cách được xác định trong $radius
.
Tôi biết bạn có một công thức Haversine đang hoạt động, nhưng nếu bạn cần Phân trang, bạn không thể sử dụng mã bạn đã cung cấp.
Hy vọng rằng điều này sẽ hữu ích.