Ini adalah implementasi saya. Saya telah memilih untuk membuat alias kueri saya sebelumnya, dengan cara ini saya dapat memanfaatkan Pagination
. Selanjutnya, Anda perlu secara eksplisit memilih kolom yang ingin Anda ambil dari kueri. tambahkan di ->select()
. Seperti users.latitude, users.longitude, products.name
, atau apa pun itu.
Saya telah membuat ruang lingkup yang terlihat seperti ini:
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]);
}
Anda dapat menerapkan cakupan ini ke model apa pun dengan latitude
danlongitude
.
Ganti $location->latitude
dengan latitude
yang ingin Anda cari, dan ganti $location->longitude
dengan garis bujur yang ingin Anda telusuri.
Ganti model.latitude
dan model.longitude
dengan Model yang ingin Anda temukan di sekitar $location
berdasarkan jarak yang ditentukan dalam $radius
.
Saya tahu Anda memiliki rumus Haversine yang berfungsi, tetapi jika Anda perlu membuat Paginate, Anda tidak dapat menggunakan kode yang Anda berikan.
Semoga membantu.