首页 > 解决方案 > Laravel / Eloquent - 无法执行原始查询

问题描述

这是执行查询的函数:

    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 接受它吗?

标签: phplaravelpostgresqlpdoeloquent

解决方案


您必须将两个坐标合并到一个绑定中:

(ST_Distance(rpoint, 'POINT( ? )', True)/1000)

$result = DB::select($expression, [$lon.' '.$lat, ...]);

推荐阅读