php - 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 接受它吗?
解决方案
您必须将两个坐标合并到一个绑定中:
(ST_Distance(rpoint, 'POINT( ? )', True)/1000)
$result = DB::select($expression, [$lon.' '.$lat, ...]);
推荐阅读
- python - Python 入门:如何使用 while 循环获得最大值?
- azure - 使用 Azure 数据工厂对单个 blob CSV 文件进行多个 TeraData cutsom 查询
- elasticsearch - 两个位置具有相对距离的 Elasticsearch 查询文档
- html - 为什么不推荐 enctype text/plain?
- python-3.x - 使用 Python 创建 PDF 文件时出错
- vba - 成功循环浏览文件夹中的文件,但所有文件都打印损坏错误
- ajax - Woocommerce 的产品过滤器以及如何在移动设备上显示它们
- api - Asp.Net CORS 安全问题
- reactjs - redux 道具未更新内部 addEventListener
- r - 使用 R 从列中计算重复均值