これが私の実装でした。事前にクエリのエイリアスを作成することを選択しました。これにより、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が必要な場合は、提供したコードを使用できません。
これがお役に立てば幸いです。