【问题标题】:Laravel / Eloquent - can not execute raw queryLaravel / Eloquent - 无法执行原始查询
【发布时间】: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('#\s{2,}#', ' ', $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。

标签: php laravel postgresql pdo eloquent


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2015-04-09
    • 2019-04-29
    • 2018-10-31
    • 1970-01-01
    • 2018-10-11
    • 2013-05-12
    • 2021-02-02
    相关资源
    最近更新 更多