首页 > 解决方案 > 雄辩的haversine公式没有按预期工作

问题描述

我陷入了haversine公式,在我的情况下它仍然不起作用。

在以下示例中,我获取用户及其所有关系。我需要根据与搜索地址的距离来检索用户。按照下面的说明,我收到以下错误:未找到列:1054 Unknown column 'distance' in 'having clause'

“activity_latitude”和“activity_longitude”都存储在我开始获取数据的主用户表中。我做错了什么?

$q = self->whereNull("deleted_at")->where("group_id", 1)
        ->with([
            "data", 
            "rating",
            "pendingcontents",
            "openinghours",
            "openinghours.dayofweek",
            "openinghoursexceptions",
            "isopeningtime",
            "contents",
            "contents.translation", 
        ]);

$q->selectRaw('( 3959 * acos( cos( radians(?) ) *
                cos( radians( activity_latitude ) )
                * cos( radians( activity_longitude ) - radians(?)
                ) + sin( radians(?) ) *
                sin( radians( activity_latitude ) ) )
                ) AS distance', [$geocodedAddress[0], $geocodedAddress[1], $geocodedAddress[0]])
->havingRaw("distance < ?", [$radius]);

然后我还需要按距离订购。

综上所述,我只需要根据距离取值,按距离排序。

我不明白为什么这个版本有效......使用相关表格及其坐标

$q->whereHas('businessdata', function ($q) use ($filtro, $geocodedAddress, $radius) {
                $q->selectRaw('( 3959 * acos( cos( radians(?) ) *
                    cos( radians( activity_latitude ) )
                    * cos( radians( activity_longitude ) - radians(?)
                    ) + sin( radians(?) ) *
                    sin( radians( activity_latitude ) ) )
                    ) AS distance', [$geocodedAddress[0], $geocodedAddress[1], $geocodedAddress[0]])
                ->havingRaw("distance < ?", [$radius]);
            });

标签: phpmysqllaraveleloquenthaversine

解决方案


您分配了一个别名(距离)。

您可以简单地使用orderBy()from

https://laravel.com/docs/5.8/queries#ordering-grouping-limit-and-offset

这将允许您使用距离别名。IE

$q->selectRaw('( 3959 * acos( cos( radians(?) ) *
                cos( radians( activity_latitude ) )
                * cos( radians( activity_longitude ) - radians(?)
                ) + sin( radians(?) ) *
                sin( radians( activity_latitude ) ) )
                ) AS distance', [$geocodedAddress[0], $geocodedAddress[1], $geocodedAddress[0]])
->havingRaw("distance < ?", [$radius])
->orderBy("distance");

您还可以为方向传递第二个可选参数(默认为“asc”)。


推荐阅读