2016-07-30 13 views
4

これは私にとっては非常に複雑なものです。郵便番号で緯度と経度に最も近い郵便番号を検索することができないことを除いて、私は非常にうまくいく検索方法です。つまり、私は緯度と経度を調べることができますが、私はそれを既存のクエリに統合する方法がわかりません。laravel 5の緯度と経度で他の結合を取得

if($request->input("postcode")) 
{ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode')); 
    $result = json_decode(curl_exec($curl)); 
    curl_close($curl); 
    $postcode_lat = $result->result->latitude; 
    $postcode_long = $result->result->longitude;    
} 

これは私が私の郵便番号latituteと経度を取得することができます:私は郵便番号の緯度と経度を取得するには、クエリに追加する何かを持っている

$query = DB::table('dogs'); 
$query->leftJoin('dog_addresses','dogs.id','=','dog_addresses.dog_id'); 
$query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id'); 
$query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id'); 
if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any") 
    { 
     $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first(); 
     $query->where('dogs.breed_id', $breed->id); 
    } 
$results = $query->get(); 

:このクエリは、郵便番号のない検索クエリです。 しかし、dogsテーブルに結合されたdog_addressesテーブルにあるlatおよびlongカラムに基づいて、場所によって犬を取得する方法はわかりません。これはどうすればいいですか?

私のdog_addressesテーブルにLatとLongの列がある場合。

だから、犬:

id | user_id | dog_name | age 

dog_addresses:

id | dog_id | address_line_1 | town | postcode | lat | long 

は、だから私のクエリのために私は育ちのIDが1であるすべての犬を取得する必要がありますが、私ができるので、インナーはビデオに参加することを私がしたいですすべてのビデオ情報と住所情報を取得しますが、緯度と経度に基づいて入力した郵便番号にどれだけ近いかによって返される犬の順序を並べ替える必要があります。

私は非常に混乱しています。私はこれを見つけました:

(3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 

しかし、私はそれをどのように統合するか、それは私のために何を使うのかまだ分かりません。

+0

私の答えを確認してください。それはあなたにとって役に立ちます – jaysingkar

答えて

4

は、あなたが望む方法で結果を取得することができるだろう。コードの説明はインラインで。

if($request->input("postcode")) 
{ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, "http://api.postcodes.io/postcodes/" . $request->input('postcode')); 
    $result = json_decode(curl_exec($curl)); 
    curl_close($curl); 
    $postcode_lat = $result->result->latitude; 
    $postcode_long = $result->result->longitude; 

    $query = DB::table('dogs'); 
    //Join statement responsible for retieving dogs addresses based on latitude and longitude in address table. 
    $query->join(DB::raw('(SELECT dog_id, (
           3959 * acos (
           cos (radians($postcode_lat)) 
           * cos(radians(lat)) 
           * cos(radians(long) - radians($postcode_long)) 
           + sin (radians($postcode_lat)) 
           * sin(radians(lat)) 
          )  
        )AS distance from dog_addresses) as dog_addresses'), function ($join){ 
      $join->on('dogs.id', '=', 'dog_addresses.dog_id') 

     }); 
    $query->leftJoin('dog_videos','dogs.id','=','dogs_videos.dog_id'); 
    $query->leftJoin('dogs_breeds','dogs.breed_id','=','dogs_breeds.id'); 
    if($request->input("breed") && $request->input("breed") != "" && $request->input("breed") != "any") 
    { 
     $breed = Dog_Breed::where("breed_name", $request->input("breed"))->first(); 
     $query->where('dogs.breed_id', $breed->id); 
    } 
    $results = $query->orderBy('dog_addresses.distance', 'ASC') //Ordering the results in ascending order by calculated distance 
        ->limit(20) //Limiting the results to 20 . Can be changed or removed according to your needs 
        ->get(); //Retrieving the results 
} 
+0

実際に私はこれで次のエラーが表示されます:未定義のメソッドを呼び出す\ Database \ Query \ JoinClause :: Select() - それは好きではないようです - > Selectを$ joinに追加しました - >をオンにします。何か案は? –

+1

@DavidGは1つをチェックして30分で知らせる – jaysingkar

+0

@DavidG – jaysingkar

1

あなたは、MySQLのGLength機能を試すことができます助けてください:コードの下

SELECT 
    *, GLength(LineString(GeomFromText('POINT(latPosCode,lngPosCode)'),GeomFromText('POINT(latInDataBase,lngInDataBase)'),)) AS DISTANCE 
FROM dogs   
ORDER BY DISTANCE 
+0

しかし、どうすれば他のテーブルに参加できますか?あなたは私に尋ねる気にならない場合 –

関連する問題