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

标签 php mysql laravel laravel-5 geospatial

我正在使用 Laravel 5,并且遇到了有关半径和邮政编码选择的难题。

我有一个酒店模型和一个大型酒店数据库。我的数据库中的每家酒店都有一个纬度/经度以及一个半径(以英里为单位)来表示他们接受顾客的距离。大多数酒店的半径为 50,但也有一些更高或更低。

我网站上的用户输入邮政编码进行搜索。我使用此邮政编码返回纬度/经度,然后查询距离它们 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”作为半径,但实际上我需要做的是使用 Hotel 表中的“半径”列。

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

最佳答案

您只需将计算出的距离与半径列中的数字(或者您在酒店表中所谓的半径列进行比较即可。

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

->havingRaw("distance <= radius")

关于php - Laravel:根据每个项目的半径选择选择一定距离内的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30458703/

相关文章:

php - 更改页面时保持 session (用户 ID)相同

mysql - 如何在查询语句中编写多个if条件

php - Laravel - 模型类,覆盖主要方法

php - 在 PHP 中将 utf8 转换为 latin1。所有大于 255 的字符都转换为 char 引用

php - 什么是好的 PHP Active Record 库?

php - 使用 shopify API 和 PHP 获取 shopify 商店中的所有产品,然后回显到 "list-products.php"页面

laravel - Homestead 9 新框创建新的 Laravel 项目 Composer 无法扫描/vendor/phpunit/php-code-coverage/src/内的类

php - 如何连接到 Wordpress 上的远程数据库

php - 将图像 PHP 上传到 MySQL 并检索正确的图像到每个表单

mysql - Laravel 按日期排序,空日期总是在最后