Questa è stata la mia implementazione. Ho scelto di dare un alias alla mia domanda in anticipo, in questo modo posso sfruttare Pagination
. Inoltre, è necessario selezionare in modo esplicito le colonne che si desidera recuperare dalla query. aggiungili in ->select()
. Ad esempio users.latitude, users.longitude, products.name
, o qualunque essi siano.
Ho creato un ambito che assomiglia a questo:
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]);
}
Puoi applicare questo ambito a qualsiasi modello con latitude
e longitude
.
Sostituisci $location->latitude
con la tua latitude
che desideri cercare e sostituisci $location->longitude
con la longitudine rispetto alla quale desideri effettuare la ricerca.
Sostituisci model.latitude
e model.longitude
con i Modelli che desideri trovare in giro per $location
in base alla distanza definita nel $radius
.
So che hai una formula Haversine funzionante, ma se devi impaginare non puoi usare il codice che hai fornito.
Speriamo che questo aiuti.