sql >> データベース >  >> RDS >> Mysql

Laravelの2点間のHaversine距離の計算

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

    これがお役に立てば幸いです。



    1. sockets.io/node.js/javascriptを使用してmysqlの特殊文字をエスケープする方法

    2. ダイナミックサンプリング12cで私を殺す

    3. MySQLはWHERE句を使用してINSERTINTOを直接挿入します

    4. SYSBACKUP権限を持つ一般ユーザー