PHP Laravel查询生成器PostgreSQLvs MySQL中的SQL语法
我使用的是Laravel5.2,使用query builder函数进行sql查询,并且在从MySQL数据库切换到PostgreSQL时中断了一个查询。查询的目的是获取某个纬度和经度范围内的所有位置PHP Laravel查询生成器PostgreSQLvs MySQL中的SQL语法,php,postgresql,laravel,laravel-5.2,Php,Postgresql,Laravel,Laravel 5.2,我使用的是Laravel5.2,使用query builder函数进行sql查询,并且在从MySQL数据库切换到PostgreSQL时中断了一个查询。查询的目的是获取某个纬度和经度范围内的所有位置 $locations = Location::select( DB::raw("*, ( 3959 * acos( cos( radians(?) ) * cos( radians( lat) )
$locations = Location::select(
DB::raw("*,
( 3959 * acos( cos( radians(?) ) *
cos( radians( lat) )
* cos( radians( long ) - radians(?)
) + sin( radians(?) ) *
sin( radians( lat ) ) )
) AS distance"))
->having("distance", "<", $distance)
->orderBy("distance")
->setBindings([$latitude, $longitude, $latitude])
->get();
切换到PostgreSQL数据源后,出现以下错误:
QLSTATE[42703]: Undefined column: 7 ERROR: column "distance" does not exist
LINE 7: ) AS distance from "locations" having "distance" < $4 o...
^ (SQL: select *,
( 3959 * acos( cos( radians(37.7959362) ) *
cos( radians( lat ) )
* cos( radians( long ) - radians(-122.4000032)
) + sin( radians(37.7959362) ) *
sin( radians( lat ) ) )
) AS distance from "locations" having "distance" < 15 order by "distance" asc)
解决此问题的最佳方法是什么。我知道MySQL和由Laravel创建的Postgres之间的SQL语法有所不同,但我正在绞尽脑汁想办法修复这个错误
任何帮助都将不胜感激 问题在于你的having子句。PostgreSQL不允许在having子句中使用派生列或列别名,而MySQL则允许,只要您启用了默认启用的Group By MySQL扩展
绕过此限制的一个选项是使用派生表,以便该字段可用于having子句。类似于以下警告:完全未经测试:
$locations = Location::from(DB::raw("(select *,
( 3959 * acos( cos( radians(?) ) *
cos( radians( lat) )
* cos( radians( long ) - radians(?)
) + sin( radians(?) ) *
sin( radians( lat ) ) )
) AS distance from locations) as t"))
->having("distance", "<", $distance)
->orderBy("distance")
->setBindings([$latitude, $longitude, $latitude])
->get();
谢谢@patricus!我可以使用您的建议使用派生表来获得解决方案。我不得不添加一个GROUPBY子句,看起来像这样:->groupByDB::raw'id,title,address_1…'。