Esta foi a minha implementação dele. Optei por criar um alias para minha consulta com antecedência, dessa forma posso aproveitar a
Pagination
. Além disso, você precisa selecionar explicitamente as colunas que deseja recuperar da consulta. adicione-os no ->select()
. Como users.latitude, users.longitude, products.name
, ou o que quer que sejam. Eu criei um escopo que se parece com isso:
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]);
}
Você pode aplicar este escopo a qualquer modelo com uma
latitude
e longitude
. Substitua o
$location->latitude
com seu latitude
que você deseja pesquisar e substitua o $location->longitude
com a longitude que você deseja pesquisar. Substitua o
model.latitude
e model.longitude
com os modelos que você deseja encontrar em $location
com base na distância definida no $radius
. Eu sei que você tem uma fórmula de Haversine funcionando, mas se você precisar paginar, você não pode usar o código que você forneceu.
Espero que isso ajude.