모델에 사용되는 Larabel의 원시 DB 쿼리에 매개 변수를 바인딩하려면 어떻게 해야 합니까?
레,
다음 질문이 있습니다.
$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();
동작하지 않는다:Invalid parameter number: mixed named and positional parameters
.
트릭이나 회피책을 알고 있는 사람이 있습니까(전체 쿼리를 작성할 수 있지만 유창한 빌더를 사용하는 것을 선호합니다).
좋아요, 몇 가지 실험을 한 후 제가 생각해낸 해결책은 다음과 같습니다.
$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();
기본적으로는setBindings
를 쿼리 상에서 호출해야 합니다.이것이 문서화되었으면 좋겠다!
오래된 질문이지만 변수를 반복해야 하는 경우 바인딩 배열의 키 값을 변경해야 합니다.
$property = Property::select(
DB::raw("title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) *
cos( radians( lat ) ) * cos( radians( lng ) - radians(:lng) ) +
sin(radians(:lat_i) ) * sin( radians( lat ) ) ) ) AS distance"),
["lat" => $lat, "lng" => $lng, "lat_i" => $lat]);
이제 됐습니다.
왜 안 되나요?
$latitude = $request->input('latitude', '44.4562319000');
$longitude = $request->input('longitude', '26.1003480000');
$radius = 1000000;
$locations = Locations::selectRaw("id, name, address, latitude, longitude, image_path, rating, city_id, created_at, active,
( 6371 * acos( cos( radians(?) ) *
cos( radians( latitude ) )
* cos( radians( longitude ) - radians(?)
) + sin( radians(?) ) *
sin( radians( latitude ) ) )
) AS distance", [$latitude, $longitude, $latitude])
->where('active', '1')
->having("distance", "<", $radius)
->orderBy("distance")
->get();
얼마 전에 같은 문제가 발생했는데, 그 오류 메시지에 답이 있습니다.mixed named and positional parameters
고객님의 경우:lat
그리고.:lng
명명된 파라미터가 있습니다.$radius
위치로서.따라서 문제를 해결할 수 있는 한 가지 방법은 다음과 같습니다.havingRaw()
지정된 파라미터를 적용합니다.
--havingRaw('distance < :radius', ['radius' => $radius])
$select = <<<SQL
title,
lat,
lng,
(3959*acos(cos(radians( ? ))*cos(radians(lat))*cos(radians(lng)-radians( ? ))+sin(radians( ? ))*sin(radians(lat)))) AS distance
SQL;
$property = Property::selectRaw($select, [$lat, $lng, $lat])
->having('distance', '<', $radius)
->orderBy('distance')
->take(20)->get();
독트린 v1에서 라라벨로 근처 수색을 맡겼는데, 여기 좀 봐.
를 추가해 주세요.Geographical
모델의 특성으로 다음과 같은 작업을 수행할 수 있습니다.
$model->newDistanceQuery($request->query('lat'), $request->query('lon'))->orderBy('miles', 'asc')->get();
바인딩과 함께 selectRaw를 사용하면 다음과 같이 동작합니다.
$sql = "((ACOS(SIN(? * PI() / 180) * SIN(" . $latName . " * PI() / 180) + COS(? * PI() / 180) * COS(" . $latName . " * PI() / 180) * COS((? - " . $lonName . ") * PI() / 180)) * 180 / PI()) * 60 * ?) as " . $unit;
if($kilometers){
$query->selectRaw($sql, [$lat, $lat, $lon, 1.1515 * 1.609344]);
}
else{
// miles
$query->selectRaw($sql, [$lat, $lat, $lon, 1.1515]);
}
언급URL : https://stackoverflow.com/questions/20864872/how-to-bind-parameters-to-a-raw-db-query-in-laravel-thats-used-on-a-model
'IT' 카테고리의 다른 글
MariaDB에서 조인된 테이블을 기반으로 행을 업데이트하려면 어떻게 해야 합니까? (0) | 2022.11.08 |
---|---|
MySQL과 Node.js (0) | 2022.11.08 |
문자열에서 문자의 발생 횟수를 카운트합니다. (0) | 2022.11.08 |
JavaScript에서 CSS 클래스를 동적으로 생성하여 적용하는 방법 (0) | 2022.11.08 |
$에 대한 경고HTTP_RAW_POST_DATA가 폐지되었습니다. (0) | 2022.11.08 |