Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Laravel查询生成器PostgreSQLvs MySQL中的SQL语法_Php_Postgresql_Laravel_Laravel 5.2 - Fatal编程技术网

PHP Laravel查询生成器PostgreSQLvs MySQL中的SQL语法

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) )

我使用的是Laravel5.2,使用query builder函数进行sql查询,并且在从MySQL数据库切换到PostgreSQL时中断了一个查询。查询的目的是获取某个纬度和经度范围内的所有位置

    $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…'。