Laravel / Eloquent - 无法执行原始查询

Posted

技术标签:

【中文标题】Laravel / Eloquent - 无法执行原始查询【英文标题】:Laravel / Eloquent - can not execute raw query 【发布时间】:2019-04-27 21:22:17 【问题描述】:

这是执行查询的函数:

    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('#\s2,#', ' ', $query));
    $expression = DB::raw($query);
    $result = DB::select($expression, [$lon, $lat, $lon, $lat, $lon, $lat, $rangeInKm]);
    dd($result);

运行此函数时出现以下异常:

SQLSTATE[HY093]: 参数号无效:参数未定义(SQL: SELECT name, population, round((ST_Distance(rpoint, 'POINT( 24.8 43.3648 )', True)/1000)::numeric, 1)作为距离,round(degrees(ST_Azimuth(rpoint, 'POINT( 24.8 43.3648 )'))::numeric,1) 作为 gis_cities 的方位角 WHERE ST_DWithin(rpoint, 'POINT( 24.8 43.3648 )', 1000*300, True) AND feature_code != 'PPLX' ORDER BY distance;)

奇怪的是,异常中显示的构建查询似乎没有丢失任何内容,如果我在我的数据库上运行该查询,它可以正常工作。我怎样才能做到这一点?

稍后编辑:

显然问题实际上在于 PDO 级别,并且是由于我试图在带引号的字符串中添加一些参数:

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

参见 'POINT( ? ? )' 部分。如果我从查询中删除所有引号,那么它可以工作,但它当然不再是有效的 postgis 查询。有人知道应该如何编写此查询以便 PDO 接受它吗?

【问题讨论】:

你试过用逗号分隔点 x 和 y 吗? POINT( ?, ? ) 大家好。正如我所说,如果我将此查询粘贴到数据库控制台中,我会得到我期望的结果而没有错误。 去掉查询字符串中的第一个SELECT是否有效? 不。并且异常中显示的查询缺少 SELECT。 【参考方案1】:

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

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

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

【讨论】:

以上是关于Laravel / Eloquent - 无法执行原始查询的主要内容,如果未能解决你的问题,请参考以下文章

Vue 2 Laravel 5.3 Eloquent 无法从对象中检索数据

Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)

当主键为 varchar 时,无法从 Laravel 的 Eloquent 中检索列值

无法使用 laravel eloquent ORM 插入 PostgreSQL

Laravel Eloquent 执行实时搜索

无法从 Laravel Eloquent 关系中获取数据