我正在使用Laravel 5并尝试返回酒店列表。
我有用户lat / lng并且我使用db :: raw语句来计算从用户到酒店的距离。该部分效果很好,在返回的酒店列表中,我可以使用$hotel->distance;
供参考:
Hotels = Hotel::select(
\DB::raw("*,
( 3959 * acos( cos( radians(" . $lat . ") ) *
cos( radians( lat ) )
* cos( radians( lng ) - radians(" . $lng . ")
) + sin( radians(" . $lat . ") ) *
sin( radians( lat ) ) )
) AS distance"))
->where('live','=', 1)
如您所见,我正在使用“距离”的别名进行实时计算。同样,这一切都很有效,直到现在。现在我正在尝试添加另一个Dropdown,以便用户可以选择所需的半径(10,20,50,100)英里等。
构建查询时,我有:
if(isset($search['distance'])) $hotels = $hotels->where('distance', '<=', $search['distance']);
我为许多可选的搜索参数执行此操作,然后在底部我按顺序对它们进行排序然后获取结果集:
$hotels = $hotels->get()
我得到的问题是:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'where clause'
原因是,当我正在进行where->distance
该列尚不存在时,它实际上不会显示,直到我执行$hotels->get()
所以我有什么选择?
我可以在不按距离过滤(大量结果)的情况下得到结果,然后从那里修剪它们,但这似乎没必要。
有什么想法吗?
答案 0 :(得分:1)
http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
标准SQL不允许在WHERE子句中引用列别名。强制执行此限制是因为在评估WHERE子句时,可能尚未确定列值。例如,以下查询是非法的:
SELECT id,COUNT(*)AS cnt FROM tbl_name WHERE cnt&gt; 0 GROUP BY id;
这与Laravel无关。这是MySQL的事情。您不能在别名上使用where条件,因为在获取结果集之前会解析条件,并且在选择结果后应用别名。
您需要使用HAVING
子句。
if(isset($search['distance']))
$hotels = $hotels->having('distance', '<=', $search['distance']);
您可以阅读有关HAVING keyword here的更多信息。