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 中检索列值