【问题标题】:Laravel 5: Unknown Column when using RAW:: and column aliasLaravel 5:使用 RAW:: 和列别名时的未知列
【发布时间】:2015-08-12 08:36:51
【问题描述】:

我正在使用 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)

如您所见,我使用“距离”的别名进行动态计算。同样,这一切都很好,直到现在。现在我正在尝试添加另一个下拉菜单,以便用户可以选择所需的半径(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-&gt;distance 时,该列还不存在,直到我执行 $hotels-&gt;get() 时它才真正出现,那么我有什么选择?

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

有什么想法吗?

【问题讨论】:

  • 尝试在列名前加上表名。 “酒店距离”

标签: php mysql laravel laravel-5


【解决方案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 > 0 GROUP BY id;

它与 Laravel 无关。这是 MySQL 的事情。不能在别名上使用where条件,因为在获取结果集之前先解析条件,在选择结果后应用别名。

你需要使用HAVING子句。

if(isset($search['distance'])) 
    $hotels = $hotels->having('distance', '<=', $search['distance']);

您可以阅读有关HAVING keyword here 的更多信息。

【讨论】:

  • 我认为 have 有同样的问题:```'have 子句'中的未知列 'distance' ```
  • @Jay 它正在工作,只是找到。请发布更改后给您错误的php代码。
  • 不,它不能正常工作,这是同一个问题: if(isset($search['distance'])) $hotels = $hotels->having('distance', '
  • 我的意思是从一开始就发布整个查询,您在选择中定义了“距离”。我写给你的这部分没问题,你在选择部分犯了错误。
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2016-01-06
  • 2015-07-14
  • 2023-03-15
相关资源
最近更新 更多