これが私の実装でした。事前にクエリのエイリアスを作成することを選択しました。これにより、Paginationを利用できます。 。さらに、クエリから取得する列を明示的に選択する必要があります。 ->select()で追加します 。 users.latitude, users.longitude, products.nameなど 、またはそれらが何であれ。
次のようなスコープを作成しました:
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]);
}
このスコープは、latitudeを持つすべてのモデルに適用できます。 およびlongitude 。
$location->latitudeを置き換えます latitudeで 検索したいものを$location->longitudeに置き換えます 検索したい経度で。
model.latitudeを置き換えます およびmodel.longitude $location周辺で見つけたいモデルを使用します $radiusで定義された距離に基づく 。
あなたが機能しているHaversine式を持っていることは知っていますが、Paginateが必要な場合は、提供したコードを使用できません。
これがお役に立てば幸いです。