2017-11-23 8 views
0

特定の都市から所定のkm以内のユーザーを検索するスクリプトがあります。データベースのユーザーは、都市、経度、および緯度を持ちます。ユーザー1はNYC、ユーザー2はワシントンDCです。私は1000kmでも距離を置くことができますが、仕事はありません。どうして?km以内のユーザーを検索できません

$user = User::with('user_data'); 
if ($request->has('city')) { 
    $user->whereHas('user_data', function($query) use ($request) { 
     return $query->where('residence', $request->city); 
    }); 
} 

if ($request->has('city')) { 

    $latitude = app('geocoder')->geocode($request->city)->get()->first()->getCoordinates()->getLatitude(); 
    $longitude = app('geocoder')->geocode($request->city)->get()->first()->getCoordinates()->getLongitude(); 

    $user->whereHas('user_data', function($query) use ($request, $latitude, $longitude) { 

     return $query->whereRaw("(6371 * acos (cos (radians(".$latitude.")) * cos(radians(residence_latitude)) * cos(radians(residence_longitude) - radians(".$longitude.")) + sin (radians(".$latitude.")) * sin(radians(residence_latitude))) <= ". $request->distance .")"); 
    }); 
} 

DB

json

+0

正確には、何を意味するかを「動作しない」のでしょうか?何がうまくいかない - エラー?計算が正しくありませんか?他に何か? – ADyson

+0

@ADyson私はNYCからのユーザーだけを参照しています.WDC – Programmmereg

+0

データベース内の生データを見ることなく、クエリが正しいかどうかを言うことは不可能です。しかし...あなたのwhereRawは2つの値を試してみるようです。私は$ request-> distanceはあなたが入力したkm単位の値であると仮定します。出力されるはずの左の計算は何ですか?それを一貫して実行します - それはあなたが期待する価値を生み出しますか? – ADyson

答えて

1

あなたの距離の計算式は、半正矢式に基づいているように見えます。

提供されたサンプルデータを使用して距離計算式のテストを開始できます。

SELECT (6371 * acos (cos (radians(53.3364746)) * cos(radians(53.4285438)) * cos(radians(14.5528116) - radians(15.05037771)) + sin (radians(53.3364746)) * sin(radians(53.4285438))) 

これがあるべき

3534.1964590146517 

国立ハリケーンセンターのウェブサイト(http://www.nhc.noaa.gov/gccalc.shtml)(四捨五入)の答えが提供する計算によると

http://sqlfiddle.com/#!9/72188/8参照)を返します:

35 

キロでそれを得るために、100であなたの答えを分割するために、あなたのformularに1つの以上のビットを追加する必要があります。

SELECT (6371 * acos (cos (radians(53.3364746)) * cos(radians(53.4285438)) * cos(radians(14.5528116) - radians(15.05037771)) + sin (radians(53.3364746)) * sin(radians(53.4285438)))/100 

は、更新されたバージョンのためhttp://sqlfiddle.com/#!9/72188/9を参照してください。

今は正解です

35.34196459014652 

を返します。あなたのPHPに翻訳

、あなたは、単に次のように1行を変更する必要があります。

return $query->whereRaw("(6371 * acos (cos (radians(".$latitude.")) * cos(radians(residence_latitude)) * cos(radians(residence_longitude) - radians(".$longitude.")) + sin (radians(".$latitude.")) * sin(radians(residence_latitude)))/100 <= ". $request->distance .")"); 
+0

それはいい答えですが、私のスクリプトは、指定された都市からのユーザーだけを返す場所でもありません。私の質問をしてください。多分それは優先されていますか?私はそれらを2つが必要 – Programmmereg

+1

私は私の質問から最初に削除され、それは動作します:) – Programmmereg

関連する問題