如何使用 Eloquent 查询两个坐标之间的距离

2024-01-13

我知道这个问题已经被问过很多次了。 但我没想到要根据我的需要来制作。

我需要查询距离另一个用户最近的用户。 基本上,我有一个users表 这个表有一个one to one与的关系users_locations具有纬度和经度字段的表。

所以我看过这个https://laravel.io/forum/04-23-2014-convert-this-geolocation-query-to-query-builder-for?page=1 https://laravel.io/forum/04-23-2014-convert-this-geolocation-query-to-query-builder-for?page=1这可能是最好的解决方案。

但我的基本查询是:

\App\Model\User::whereNotIn('id', $ids)
               ->where('status', 1)
               ->whereHas('user_location', function($q) use ($lat, $lng, $radius) {
                    /** This is where I'm stuck to write the query **/
             })->select('id', 'firstname')
               ->get();

我不知道在这种情况下如何实施该解决方案。

预先感谢您的帮助

EDIT更清楚地说: 我需要获取半径 5 公里内的用户。


感谢 EddyTheDove 和 Ohgodwhy,我找到了解决方案。

所以就是这样:

\App\Model\User::whereNotIn('id', $ids)
           ->where('status', 1)
           ->whereHas('user_location', function($q) use ($radius, $coordinates) { 
                  $q->isWithinMaxDistance($coordinates, $radius);
         })->select('id', 'firstname')
           ->get();

而在我的UserLocation模型我有这个本地范围

public function scopeIsWithinMaxDistance($query, $coordinates, $radius = 5) {

    $haversine = "(6371 * acos(cos(radians(" . $coordinates['latitude'] . ")) 
                    * cos(radians(`latitude`)) 
                    * cos(radians(`longitude`) 
                    - radians(" . $coordinates['longitude'] . ")) 
                    + sin(radians(" . $coordinates['latitude'] . ")) 
                    * sin(radians(`latitude`))))";

    return $query->select('id', 'users_id', 'cities_id')
                 ->selectRaw("{$haversine} AS distance")
                 ->whereRaw("{$haversine} < ?", [$radius]);
}

Ohgodwhy 的原始答案在这里:Laravel 中两点之间的半正矢距离计算 https://stackoverflow.com/questions/37876166/haversine-distance-calculation-between-two-points-in-laravel

EDIT

另一种使用 MySQL 中的存储函数执行此操作的方法:

    DELIMITER $$
DROP FUNCTION IF EXISTS haversine$$

CREATE FUNCTION haversine(
        lat1 FLOAT, lon1 FLOAT,
        lat2 FLOAT, lon2 FLOAT
     ) RETURNS FLOAT
    NO SQL DETERMINISTIC
    COMMENT 'Returns the distance in degrees on the Earth
             between two known points of latitude and longitude'
BEGIN
    RETURN DEGREES(ACOS(
              COS(RADIANS(lat1)) *
              COS(RADIANS(lat2)) *
              COS(RADIANS(lon2) - RADIANS(lon1)) +
              SIN(RADIANS(lat1)) * SIN(RADIANS(lat2))
            ));
END$$

DELIMITER ;

我乘以 111.045 将结果转换为公里。 (我不确定这个值是否正确,我发现许多其他值与这个值相差不远,所以如果有人对此有精确度,那就太好了)

来源文章:https://www.plumislandmedia.net/mysql/stored-function-havesine-distance-computation/ https://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/

然后用雄辩的方式:

\App\Model\User::whereNotIn('id', $ids)
       ->where('status', 1)
       ->whereHas('user_location', function($q) use ($radius, $coordinates) { 
            $q->whereRaw("111.045*haversine(latitude, longitude, '{$coordinates['latitude']}', '{$coordinates['longitude']}') <= " . $radius]);
     })->select('id', 'firstname')
       ->get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Eloquent 查询两个坐标之间的距离 的相关文章

  • laravel - 使用请求类或输入类

    在宁静的控制器中 我应该使用哪个类来获取传递的变量 member gt email Input get email or member gt email Request get email 两种选择都适合我 但有什么区别 Input get
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • SQL Server 2005 是否有与 MySql 的 ENUM 数据类型等效的数据类型?

    我正在开发一个项目 我想在表中存储一些容易枚举的信息 MySql 的枚举数据类型正是我想要的 http dev mysql com doc refman 5 0 en enum html http dev mysql com doc ref
  • 媒体的 Google Cloud Storage 签名网址

    我已经建立了一个视频网站 为用户提供 m3u8 和关联的 ts 文件 我不希望媒体文件免费可用 所以我所做的是 当用户在网站上时 在 mysql 中使用他们的 IP 和令牌创建一个会话 当他们请求特定媒体子域 mp4 domain com
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

    我正在使用 PHP Selenium Webdriver 包装器Facebook https github com facebook php webdriver 任何人都可以给我一个如何单击或从选择下拉菜单中选择选项的示例吗 我已经尝试过这
  • CakePHP 查找 - 按字符串到整数排序?

    我想使用 CakePHP 从数据库中提取照片数组 按照片标题排序 0 1 2 3 我的查询当前看起来像 ss photos this gt Asset gt find all array conditions gt array kind g
  • 使用 PHP PayPal REST API 退款?

    我正在开发一个集成到 PayPal 的 REST API 中的 PHP 应用程序 我正确处理了事务并将事务 ID 保存到 MySQL 数据库中 我现在正在尝试退款 但无法让它停止给出 传入 JSON 请求未映射到 API 请求 错误 有人对
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 如何纠正这个非法字符串偏移?

    我收到此错误 警告 第 32 行 home mysite public html wp content themes evento lib php extra class php 中的非法字符串偏移 type 我意识到文件中的这部分代码是错
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • Facebook 应用程序无法获取会话

    我正在 Heroku 上为 Facebook 开发一个非常基本的 PHP 应用程序 它显示非常基本的用户信息 如姓名 个人资料图片 但该应用程序在 getToken 方法中停止 我在登录我的个人资料后尝试了该应用程序 但仍然出现相同的消息
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • Codeigniter - 出现 404 Not Found 错误

    我们在 godaddy 有两个托管套餐 我们的实时网站使用以下 htaccess 文件运行良好 无需在 url 中使用 index php 即可访问网站 RewriteEngine On RewriteCond REQUEST FILENA
  • 如何将 Smarty 3 包含到 Laravel 4 中?

    我是 Laravel 的新手 所以仍在习惯这些概念 但是我有大约 10 年的使用 Smarty 的经验 所以我希望利用这一点 除了事实上 Blade 似乎缺乏太多我发现有用且在 Smarty 中开箱即用的功能 但无论如何除了这个问题的要点之
  • 如何删除文件

    我们有一个脚本 scripts ourscript php和一个文件 media movie1 flv 当我们运行时 我们如何删除这个文件ourscript php Using unlink http php net manual en f
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行

随机推荐

  • mplcursors:显示并突出显示附近局部极值的坐标

    我有代码显示 matplotlib 散点图中每个点的标签 使用复合光标 https mplcursors readthedocs io en stable 如同这个例子 https mplcursors readthedocs io en
  • htaccess - 重写以捕获友好的 URL 或查询字符串

    我正在尝试提出一个或多个重写规则 这些规则将采用友好的 url 或包含完整查询字符串的 url 该计划是通过使用 PHP 的 loadHTML 读取 URL 来创建纯文本页面 例如 Input 1 http www example com
  • body 标记末尾的渲染阻塞 Javascript - 内联脚本与外部脚本

    这是基于观察的后续行动上一个问题 https stackoverflow com questions 59468048 render blocking javascript at end of body tag firefox render
  • 使用多态函数从选项中提取对象

    无形状文档解释了如何使用多态函数来创建将一种容器中的对象映射到另一种容器中的函数 但是当您想从容器中解压东西时该怎么办 我有一个选项列表 val options Some 1 Some A Some 3 5 HNil 我想要一个多态函数 可
  • Twitter Bootstrap 图标或 ASCII 代码中的货币代码

    我正在 twitter bootstrap 中构建一个电子商务网站 我想在其中使用货币符号 图标在里面 我必须有其他选择 将货币代码写在ASCII码第二个是通过 twitter bootstrap 图标 我在其中创建自己的 css 到特定图
  • Tomcat 支持 HTTP/2.0?

    有谁知道Tomcat支持HTTP 2 0的最低版本是多少 我一直在他们的网站上到处寻找 但找不到有关此的任何详细信息 我是 Jetty 中的 HTTP 2 实现者 并且我关注其他实现 HTTP 2 的项目 雄猫队的马克 托马斯 Mark T
  • 如何在 Nginx 中启用 h2c?

    有没有办法在 Nginx 1 9 5 及以上版本中启用 h2c 又名 HTTP2 明文 我尝试过在 TL 上使用 h2https chronic101 xyz https chronic101 xyz它可以工作 但是我也想在端口 80 上实
  • 在 Linux 中将一个串行端口通过管道连接到另一个端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将一个串行端口数据 无论数据类型 传输到另一个串行端口的方法 就我而言 我试图从一个串行端口接收数据 并通过连接到另一个串行
  • 循环创建前 12 个月的列表

    有没有办法使用 PHP 循环根据当前月份 不包括当前月份 创建如下所示的前 12 个月的列表 该值应始终是每月的第一天 格式 yyyy mm dd 下拉列表本身应仅显示年份和月份 格式 yyyy mm
  • Extjs 5. Ext.application 不是一个函数。为什么?

    我在控制台中收到错误 Ext application is not a function My index html文件包含以下代码 While app js只有这段代码 取自一个演示 Ext applic
  • 如何强制从 iDevice 中删除应用程序

    我使用 TestFlight 分发应用程序进行 Beta 测试 客户拥有运行 iOS5 1 的 iPhone 4 并且无法从主屏幕删除应用程序 该应用程序是通过 TestFlight OTA 安装的 该应用程序图标上有一个空的进度条 点击时
  • Java 8 函数式接口的 lambda 模糊方法 - 目标类型

    我有以下代码 public class LambdaTest1 public static void method1 Predicate
  • 调色板库在 GridView 中滚动时更改颜色

    我在实现新的 Palette 库时遇到了一些问题 在 4 4 4 上 com android support palette v7 21 0 我正在尝试为 GridView 中每个项目的一部分着色 效果很好 但是当我将一个项目从屏幕上滚动然
  • NameError:名称“fcntl”未定义

    我已经安装了PuDB on python 3 4 2这是在virtualenv并运行在windows 7 sp1 我首先激活virtualenv workon env01 然后进入python控制台 python 现在我需要测试 PuDB
  • Excel 到 ADO RecordSet 的数字单元格具有空值

    我正在尝试从 Excel 文件导入一些数据来使用 但遇到了数字单元格值的问题 我有一些列的值 其中一些值都是数字 而其他值可能是数字和非数字值的混合 没有特殊字符 只有 A Z 字母 要将数据提取到记录集中 我正在执行以下操作 Set oc
  • PHP 中的负零等于 0 吗?

    我有一个非常基本的 MySQL 查询 它从数据库表中读取行 并将行值添加或减去定义为 total balance 的 PHP 字符串 例如 statement details query mysqli query con SELECT tr
  • 如何定义一个函数来检查句子结束后字符串是否有空格?

    这是我到目前为止尝试过的 def whitespace string for s in string if s 1 return s ended with whitespace s else return s was whitespace
  • round() 和 trunc() 函数有什么区别?

    我对这些功能很困惑 在数学中 rounding http en wikipedia org wiki Rounding表示四舍五入到最接近的整数 因此四舍五入 3 4 的结果是 3 四舍五入 3 6 的结果是 4 Truncating ht
  • Crystal Reports 使用 13.0.2000 的哪个版本?

    我的任务是对几年前编写的 ASP NET Web Forms 应用程序进行一些小的更改 该应用程序的实现者已经不在我们身边 几年前就离开了 该应用程序中有 6 个报告 所有报告都使用某些版本的 Crystal Reports 当我看着Web
  • 如何使用 Eloquent 查询两个坐标之间的距离

    我知道这个问题已经被问过很多次了 但我没想到要根据我的需要来制作 我需要查询距离另一个用户最近的用户 基本上 我有一个users表 这个表有一个one to one与的关系users locations具有纬度和经度字段的表 所以我看过这个