计算 Laravel 中的坐标距离

2024-03-27

我的模型中有一个创建别名的范围,我需要在其上执行一个 where ,我知道 MySql 不允许这样做。

标准 SQL 不允许您在 WHERE 中引用列别名 条款。施加此限制是因为当 WHERE 代码为 执行后,列值可能尚未确定。

但是,我想知道 laravel 是否有可能解决? 我的示波器创建了别名距离,我想检查该距离。

public static function scopeDistance($query, $lat, $long)
{
    return $query->select(array('*',\DB::raw('( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $long . ') ) + sin( radians(' . $lat .') ) * sin( radians(latitude) ) ) ) AS distance')));
} 

在我的控制器中:

\App\Profile::distance($latitude, $longitude)->where('distance', '<', 50);

首先,不要忘记删除static函数调用中的关键字,Laravel 处理神奇的静态的 Profile::distance call.

以下是解决同一问题的 2 个不同选项,无论哪种情况,您都会致电\App\Profile::distance($latitude, $longitude, 50)从您的控制器。

Option 1

您可以在内存中进行计算,而不用处理子查询。

public function scopeDistance($query, $lat, $long, $distance) {
    return Profile::all()->filter(function ($profile) use ($lat, $long, $distance) {
        $actual = 3959 * acos(
            cos(deg2rad($lat)) * cos(deg2rad($profile->latitude))
            * cos(deg2rad($profile->longitude) - deg2rad($long))
            + sin(deg2rad($lat)) * sin(deg2rad($profile->latitude))
        );
        return $distance < $actual;
    });
}

Option 2

您可以执行 SQL 子查询,请确保以结束调用get():

public function scopeDistance($query, $lat, $long, $distance) {
    return $query->having('distance', '<', $distance)
             ->select(DB::raw("*,
                     (3959 * ACOS(COS(RADIANS($lat))
                           * COS(RADIANS(latitude))
                           * COS(RADIANS($long) - RADIANS(longitude))
                           + SIN(RADIANS($lat))
                           * SIN(RADIANS(latitude)))) AS distance")
             )->orderBy('distance', 'asc')
              ->get();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 Laravel 中的坐标距离 的相关文章

  • a 是什么意思? (点)在 PHP 中做什么?

    以下命令在 PHP 中执行什么操作 string string is something which I declared in the program 就其本身而言 它根本没有任何作用 它不是有效的语法 但是 如果你有这样的事情 你会看见
  • 为什么 PHP 不替换字符串中的变量? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我不明白为
  • 一个电子邮件地址中可以有多少个@符号?

    是否有任何规则要求在任何电子邮件 ID 中包含指定数量的 符号 如果我们要使用 PHP 检查电子邮件 ID 是否有效 我就会想到 如果引用多个 被允许 我必须问你为什么需要这些信息 拜托拜托please不要尝试编写正则表达式 函数或其他任何
  • 服务器发送的事件在脚本完成之前不会更新

    我有一个更新数据库的小脚本 目前处理时间大约需要一分钟左右 但是随着数据库的增加 时间也会增加 我想在脚本运行时向用户提供更新 以便他们知道脚本的状态并且它仍在运行 我实现了服务器端事件 虽然它有效 但在脚本完全完成之前 不会将任何更新发布
  • php 的问题:读取文件名,生成 javascript 和 html

    UPDATE 再一次问好 我发现自己遇到了一个新问题 php代码在我的PC wamp服务器 上完美运行 但我现在已将其上传到免费的网络主机服务器上 虽然php部分运行完美 它生成数组 但javascript函数本身不起作用 因为没有照片在网
  • 按“计数(列不为空)”排序

    我正在寻找一种方法 通过值不为空的列的计数来对 MySQL 结果进行排序 所以 id 1 1 0 1 1 4 id 0 1 1 1 0 3 id 0 0 0 1 1 2 id 1 0 0 0 0 1 在上面的例子中 我忽略了 ID 列 但实
  • 如何根据请求打开多个浏览器窗口? (PHP)

    所以我有一个表格PHP HTML页 用户将其提交给同一PHP HTML页 现在我将拥有 PHP 页面 POST数据 我想在刷新页面时选择一些弹出浏览器窗口 其中 url 将相对于用户POST要求 喜欢www example com bal
  • 如何使用php取消设置mongodb中的所有记录字符串?

    我的数据库记录了这样的事情 id ObjectId 50118b145e69ef2c0e007a2 class customer dbid 1829 value email protected cdn cgi l email protect
  • 如何处理 pcntl_fork(): 错误 35?

    我有 php7 CLI 守护进程 它连续解析文件大小超过 50M 的 json 我试图使用 pcntl fork 的单独进程将每 1000 个解析数据条目保存到 mysql 对于约 200k 行 它工作得很好 然后我得到pcntl fork
  • Android:Json 无法从 mysql 数据库检索任何文件,它是空的

    我是 android 新手 我正在使用 mysql 数据库 其中我链接 php 文件进行连接 工作正常 但我的代码没有显示任何内容 它只显示背景色黑色 而不是显示数据库中的数据 public class HomeFragment exten
  • PHP:如果我以非静态方式调用静态方法怎么办?

    我不是面向对象编程专业人士 我有一个愚蠢的问题 class test public static function doSomething arg foo I ate your arg return foo 那么正确的调用方式doSomet
  • 如何创建具有两个主键和两个外键的表?

    create table Machine Machine ID int primary key Machine Name varchar 30 Machine Title varchar 30 create table Part Part
  • 标签系统:Toxi 解决方案问题

    我对标签数据库模式的 Toxi 解决方案感到有点困惑 我正在开发一个系统 用户可以向该系统提交项目 并且这些项目可以具有与其关联的标签 在阅读了 tagchemas 后 我发现 Toxi 解决方案最适合我的需求 但是 我不完全确定我的计划是
  • cmd的字符集

    C Users Kolink gt php r echo C Users Kolink gt echo 正如你所看到的 一个程序输出一个 结果是 但使用echo命令给出所需的字符 并且 我可以配置 PHP 也许是脚本开头的某个命令 来输出正
  • 使用日期作为窗口函数实现 RANGE

    从 SQLAlchemy 1 4 25 开始 没有内置支持 所以我尝试使用该解决方案here https stackoverflow com a 69606048 11277108 这是我的复制 from datetime import d
  • 将一个元素移到数组末尾

    我有一个包含 parank 值列表的数组 考虑下面的数组 Array 0 gt stdClass Object pagerank gt 3 1 gt stdClass Object pagerank gt 1 2 gt stdClass O
  • 最简单的问题:从数组中提取值

    这是一个例子 Array 0 gt Array title gt Title 1 checkout gt 1 no gateway gt 0 1 gt Array title gt Title 2 checkout gt 1 no gate
  • 如何获取MySQL中最后更新的行的ID?

    如何使用 PHP 获取 MySQL 中最后更新行的 ID 我找到了这个问题的答案 SET update id 0 UPDATE some table SET column name value id SELECT update id id
  • array_search 返回错误的键[重复]

    这个问题在这里已经有答案了 我有这个数组 ar key1 gt John key2 gt 0 key3 gt Mary 并且 如果我写 idx array search Mary ar echo idx I get key2 我在网上搜索过
  • 提取两个段落之间的共同词?

    如何提取php5中两个或多个段落之间的常用词 我想总结每个文本以创建排名靠前的单词列表可能会起作用 然后比较它们 我想最基本的方法是 split each paragraph into an array of words using eit

随机推荐