mysql - 在 Laravel 中使用谷歌地图和 mysql 进行半径搜索

标签 mysql laravel laravel-5

如何在 Laravel Controller 中编写此查询

SELECT *, ACOS( SIN( RADIANS( lat ) ) * SIN( RADIANS( $lat ) ) + 
       COS( RADIANS( lat ) ) * COS( RADIANS( $lat )) * COS( RADIANS( lon ) -
       RADIANS( $long )) ) * 6380 AS distance 
FROM places
WHERE ACOS( SIN( RADIANS( lat ) ) * SIN( RADIANS( $lat ) ) + 
  COS( RADIANS( lat ) ) * COS( RADIANS( $lat )) * COS( RADIANS( lon ) - 
  RADIANS( $long )) ) * 6380 < 10 
ORDER BY distance

10是以公里为单位的半径 $lat 和 $long 是中心或圆 如果您的表格,纬度和经度是属性

最佳答案

您只是在这里实现半正矢公式。他是一个可以附加到模型的快速范围。

public function scopeCloseTo($query, $location, $radius = 25)
{

    /**
     * In order for this to work correctly, you need a $location object
     * with a ->latitude and ->longitude.
     */
    $haversine = "(6371 * acos(cos(radians($location->latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($location->longitude)) + sin(radians($location->latitude)) * sin(radians(latitude))))";
    return $query
        ->select(['comma','separated','list','of','your','columns'])
        ->selectRaw("{$haversine} AS distance")
        ->whereRaw("{$haversine} < ?", [$radius]);
}

在上面的函数中,您可以将 $radius 设置为第三个参数,因此在您的情况下为 10

第二个参数是一个位置,您希望从该位置查找半径 内的地点。将此视为您的起点。

例如;如果你想到达你家附近的所有地方。然后,your house 将作为 location 对象作为第三个参数传递,并带有 longitudelatitude 属性。

您可以调整弧度(经度)以匹配您的模型表。或者您可以使用 this 来引用当前模型,并使其可重用(这是我们选择的。

然后你可以像这样调用它:

App\Models;

class Hairdresser extends Eloquent {
    //scopeCloseTo function in here
}

最后,调用它:

$hairdressers = Hairdresser::closeTo($location, 10);

它将找到距您的$location 10 公里范围内的所有美发师

关于mysql - 在 Laravel 中使用谷歌地图和 mysql 进行半径搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621531/

相关文章:

php - 循环重复相同的数据 8 次或更多次

跨多列的mysql关键字搜索

mySql 到 PDO 片段

mysql - 由字母和数字组成且递增的 ID 号应使用什么类型

php - 配置 PhpStorm RESTful 客户端以使用 Laravel

php - 隐式路由模型绑定(bind)

php 两个依赖的下拉菜单 mysql 查询获取数组

php - 从 laravel 的数据库中获取所有帖子及其评论

php - 拉维尔 5 : Controller Inter-Communication and Instantiation

php - Laravel 连接表不返回任何数据