2016-07-30 2 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 테이블에있는 위도 및 아래 긴 열을 기반으로 위치를 기준으로 개를 얻는 방법을 알지 못합니다. 어떻게해야합니까?

내 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

사실 나는 다음과 같은 오류가 발생합니다 : 정의되지 않은 메서드를 호출하십시오 Illuminate \ Database \ Query \ JoinClause :: Select() - 싫어하는 것 같습니다 -> $ join에 추가 선택 -> 켜기. 어떤 아이디어? –

+1

@DavidG가 하나를 선택하고 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

하지만 어떻게 다른 테이블에 가입 할 수 있습니까? 당신이 내게 묻는 신경 쓰지 않는다면 –

관련 문제