C'était ma mise en œuvre. J'ai choisi d'aliaser ma requête à l'avance, de cette façon je peux profiter de la Pagination
. De plus, vous devez sélectionner explicitement les colonnes que vous souhaitez récupérer à partir de la requête. ajoutez-les au ->select()
. Tels que users.latitude, users.longitude, products.name
, ou quoi que ce soit.
J'ai créé une étendue qui ressemble à ceci :
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]);
}
Vous pouvez appliquer cette portée à n'importe quel modèle avec une latitude
etlongitude
.
Remplacez le $location->latitude
avec votre latitude
que vous souhaitez rechercher, et remplacez le $location->longitude
avec la longitude sur laquelle vous souhaitez effectuer la recherche.
Remplacez le model.latitude
et model.longitude
avec les modèles que vous souhaitez trouver autour du $location
basé sur la distance définie dans le $radius
.
Je sais que vous avez une formule Haversine fonctionnelle, mais si vous devez paginer, vous ne pouvez pas utiliser le code que vous avez fourni.
J'espère que cela vous aidera.