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.