这是执行查询的函数:
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:选择名称,人口,round((ST_Distance(rpoint,'POINT(24.8 43.3648)',True)/ 1000)::numeric,1)作为距离,圆形(度(ST_Azimuth(rpoint,'POINT(24.8 43.3648)'))::numeric,1)作为gis_cities的方位角,其中ST_DWithin(rpoint,'POINT(24.8 43.3648)',1000 * 300,True)和feature_code!= 'PPLX' 按距离排序;)
奇怪的是,异常中显示的构建查询似乎没有任何遗漏,如果我在我的数据库上运行该查询,它可以正常工作。我怎样才能使这项工作?
后期编辑:
显然问题实际上在于 PDO 级别,并且是由于我试图在带引号的字符串中添加一些参数引起的:
(ST_Distance(rpoint, 'POINT( ? ? )', True)/1000)
请参阅“POINT(??)”部分。如果我从查询中删除所有引号,那么它可以工作,但它当然不再是有效的 postgis 查询。有人知道应该如何编写此查询以便 PDO 接受它吗?