Laravel 4无法查询postgres功能

时间:2014-03-25 20:30:58

标签: postgresql laravel geolocation laravel-4

我有一个postgres函数distance(),它确定两点之间的距离。

DECLARE                                                   
    x float = 69.1 * (lat2 - lat1);                           
    y float = 69.1 * (lon2 - lon1) * cos(lat1 / 57.3);        
BEGIN                                                     
    RETURN sqrt(x * x + y * y);                               
END

在Postgres中执行时,此工作正常。但现在我想在Laravel 4搜索中使用它来查找半径内的所有地址。使用查询构建器我有

$query->where(\DB::select('select distance(coords,'.$parameters['lat'].','.$parameters['lon'].')') < 9);

这应该查看地址中的coords字段(例如&#39; 39.606912,-104.881802&#39;)并在查询中解析它。它错误地说列&#39; coords&#39;不存在。如果我使用&#34;地址&#34;。&#34; coords&#34;然后说它找不到桌子。

1 个答案:

答案 0 :(得分:0)

通常DB :: raw()在这些情况下工作,并且命令中有一些缺少的逗号和引号

$query->where(\DB::select(\DB::raw('select distance(coords,'.$parameters['lat'].','.$parameters['lon'].')')), '<', '9');

要确保Laravel以您需要的方式构建它,并且它构建的查询将在您的数据库上运行,请使用此命令将您的查询转储到日志中:

DB::listen(function($sql, $bindings, $time) { 
    Log::info($sql); 
    Log::info($bindings); 
});

您的错误是说您缺少FROM,因此您的查询应该是:

$query->where(
    \DB::select(
        \DB::raw('select distance(addresses.coords,'.$parameters['lat'].','.$parameters['lon'].') FROM addresses')
    )
    , '<', '9'
);

但是,如果这只是查询的一部分而不是整个查询,则不应该需要FROM,除非您从另一个表中获取此信息,该表尚未在您的主查询FROM列表中。