Это функция, которая выполняет запрос:
public static function getNearbyCityReport(float $lon, float $lat, float $rangeInKm){
$query = "
SELECT
name,
population,
round((ST_Distance(rpoint, 'POINT( ? ? )', True)/1000)::numeric, 1) as distance,
round(degrees(ST_Azimuth(rpoint, 'POINT( ? ? )'))::numeric,1) AS azimuth
FROM
gis_cities
WHERE
ST_DWithin(rpoint, 'POINT( ? ? )', 1000*?, True)
AND
feature_code != 'PPLX'
ORDER BY distance;
";
$query = preg_replace('#\n#', ' ', $query);
$query = trim(preg_replace('#\s{2,}#', ' ', $query));
$expression = DB::raw($query);
$result = DB::select($expression, [$lon, $lat, $lon, $lat, $lon, $lat, $rangeInKm]);
dd($result);
При запуске этой функции я получаю следующее исключение:
SQLSTATE [HY093]: Неверный номер параметра:параметр не был определен (SQL: SELECT имя, население, круг ((ST_Distance (rpoint, 'POINT (24.8 43.3648)', True) / 1000) :: числовой, 1) как расстояние, круг (градусы (ST_Azimuth (rpoint, ')POINT (24,8 43,3648) ')) :: числовой, 1) AS азимут ОТ gis_cities WHERE ST_DWithin (rpoint,' POINT (24,8 43,3648) ', 1000 * 300, True) И feature_code! =' PPLX 'ORDER BY distance;)
Странно то, что в построенном запросе, показанном в исключении, кажется, ничего не пропущено, и если я выполню этот запрос в своей базе данных, он будет работать правильно .Как я могу сделать эту работу?
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:
Очевидно, что проблема на самом деле лежит на уровне PDO и вызвана тем, что я пытаюсь добавить некоторые параметрывнутри строки в кавычках:
(ST_Distance(rpoint, 'POINT( ? ? )', True)/1000)
См. 'POINT (??)' частей.Если я удаляю все кавычки из моего запроса, тогда он работает, но, конечно, он больше не является действительным постгис-запросом.Кто-нибудь знает, как должен быть написан этот запрос, чтобы PDO его принял?