2014-10-23 3 views
2

그래서 특정 거리 내의 다른 특정 점에 가장 가까운 점을 찾으려고합니다. 그리고 이것을 위해 haversine 공식을 사용하고 있습니다. 원시 쿼리 자체는 다음과 같습니다 input_latinput_long 내가 내 센터 검색 지점에서 시작하려는 내 사전 정의 된 좌표입니다Laravel 4 :이 복잡한 원시 지리적 SQL 쿼리를 Eloquent를 사용하여 어떻게 변환합니까?

SELECT id, 
(3959 * acos(cos(radians(input_lat)) * cos(radians(map_loc_lat)) * cos(radians(map_loc_long) - radians(input_long)) + sin(radians(input_lat)) * sin(radians(map_loc_lat)))) 
AS distance FROM posts HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

map_loc_latmap_loc_longposts '포인트입니다. 내 입력 위도를 표시하기 위해

$query->selectRaw('id, (6371 * acos(cos(radians(?)) * cos(radians(map_loc_lat)) 
    * cos(radians(?) - radians(?)) + sin(radians(?)) 
    * sin(radians(map_loc_lat)))) AS distance',) 

그러나 나는 물음표를 지정하는 방법에 대한 혼란 스러워요 : 나는, 무거운의 부분을 너무 좋아하는 웅변의 selectRaw() 방법을 사용하기 위해 노력하고있어

그리고 Eloquent를 사용하는 경도, 그리고 어떻게하면 절과 내 한계에 따라 내 주문을 계속 묶을 수 있을까요?

+0

오류 메시지 : 대신 여기 DB::raw()select()

를 사용하는 다른 해결책을 찾지 못했습니다하는 예입니다 멀리? 주문에 대해서는 다음을 사용할 수 있습니다 : $ query-> orderBy ('id', 'DESC'); ' – mrquad

+0

내 쿼리의'selectRaw()'부분을 제대로 실행할 수 없습니다. "잘못된 매개 변수 번호"오류가 발생합니다. – ReactingToAngularVues

답변

4

내 프로젝트 중 하나에서 동일한 sql을 사용했습니다.

$distance = Input::get('distance', 0.1); 
$lat = Input::get('latitude'); 
$lng = Input::get('longitude'); 
$select="drops.*,(6371 * acos(cos(radians({$lat})) * cos(radians(drops.latitude)) * cos(radians(drops.longitude) - radians({$lng})) + sin(radians({$lat})) * sin(radians(drops.latitude)))) AS distance"; 
$drops_query = DB::table('drops')->select(DB::raw($select)) 
        ->addSelect('users.login as username') 
        ->leftJoin('users', 'users.id', '=', 'drops.user_in') 
        ->where('drops.latitude','<>','') 
        ->where('drops.longitude','<>',''); 
$drops_query = $drops_query->having('distance', '<=', $distance)->orderBy('distance','DESC'); 
$drops = $drops_query->take($limit)->get(); 

이 접근 날이 복잡한 쿼리에 몇 가지 추가 필터링, 페이지 매김을 추가하자 등 등

+0

네, 훌륭합니다 - 나는 나의 요구에 맞게 코드를 수정했습니다. 이 작업을 수행하는 유일한 방법은'DB :: raw'와 같을 것입니다. 건배. – ReactingToAngularVues