我有一个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;然后说它找不到桌子。
答案 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列表中。