Laravel에서 복잡한 원시 데이터베이스 쿼리로 작업할 때 바인딩 매개변수는 오류를 방지하는 데 매우 중요합니다. 이러한 상황은 모델 기반 접근 방식을 사용할 때 자주 발생합니다.
사용자가 접한 다음 쿼리를 고려해보세요.
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) + sin( radians(:lat) ) * sin( radians( lat ) ) ) ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat]) ) ->having("distance", "<", $radius) ->orderBy("distance") ->take(20) ->get();
이 쿼리는 특정 지점으로부터의 거리를 기준으로 속성을 필터링하려고 시도합니다. 원시 SQL 계산을 사용합니다. 그러나 명명된 매개변수와 위치 매개변수가 혼합되어 오류가 발생합니다.
이 문제를 해결하려면 쿼리 바인딩을 명시적으로 지정할 수 있는 setBindings 메서드를 활용해야 합니다. 수정되고 작동하는 코드는 다음과 같습니다.
$property = Property::select( DB::raw("title, lat, lng, ( 3959 * acos( cos( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians( ? ) ) * sin( radians( lat ) ) ) ) AS distance") ) ->having("distance", "<", "?") ->orderBy("distance") ->take(20) ->setBindings([$lat, $lng, $lat, $radius]) ->get();
원시 SQL에서 위치 자리 표시자(?)를 사용하고 적절한 값 배열과 함께 setBindings를 호출하면 쿼리가 올바르게 실행되어 매개변수를 적절한 자리 표시자에 바인딩합니다. .
위 내용은 Laravel의 복잡한 원시 쿼리에서 매개변수를 올바르게 바인딩하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!