Laravel:根据每个项目半径选择选择一定距离内的模型

时间:2015-05-26 12:32:49

标签: php mysql laravel laravel-5 geospatial

我正在使用Laravel 5,并且在半径和邮政编码选择方面遇到了一个棘手的问题。

我有酒店模型和大型酒店数据库。我的数据库中的每个酒店都有一个Lat / Lng,以及他们接受客户的距离的半径(英里)。这些酒店中的大多数半径为50,但有些更高或更低。

我网站上的用户输入一个邮政编码进行搜索。我使用此邮政编码返回Lat / Lng,然后查询距离它们X英里范围内的所有酒店。我目前正在使用此代码:

$lat = '123'; // geocoded from user entered zip
$lng = '123'; // geocoded from user entered zip
$radius = '50'; // currently, hardcoded, need to change

$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"))
        ->having("distance", "<", $radius)
        ->orderBy("distance")
        ->get();

正如您在上面所看到的,我目前正在努力将“50”编码为半径,但我真正需要做的是使用酒店表中的“半径”列。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您应该只需要将计算出的距离与半径列中的数字进行比较(或者您在酒店表中调用半径列。

尝试使用此having替换havingRaw子句。您需要将radius更改为表格中存储酒店半径的列名称。使用小于或等于也可能更好。

->havingRaw("distance <= radius")