Laravel 5:使用RAW ::和列别名

时间:2015-05-29 12:56:58

标签: php mysql laravel laravel-5

我正在使用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()所以我有什么选择?

我可以在不按距离过滤(大量结果)的情况下得到结果,然后从那里修剪它们,但这似乎没必要。

有什么想法吗?

1 个答案:

答案 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的更多信息。