【问题标题】:Laravel: Get results from database based on lat longLaravel:根据 lat long 从数据库中获取结果
【发布时间】:2019-04-28 00:25:53
【问题描述】:

我是 laravel 的新手,使用 laravel 5.6,我正在研究 API。在 API 结果中,我希望所有在买方 50 英里半径范围内的卖方都有分页。 到目前为止,这是我尝试过的:

$lat = Auth::user()->latitude;
$long = Auth::user()->longitude;
$products = DB::table('products')
                ->select(DB::raw('title, ( 
                        6371 * acos( cos( radians({$lat}) 
                    ) * cos( 
                        radians( `latitude` ) 
                    ) * cos( 
                        radians( `longitude` ) - radians({$long}) 
                    ) + sin( 
                        radians({$lat}) 
                    ) * sin( radians( `latitude` ) ) 
                ) 
            ) AS distance'))
            ->where('distance', '<', 50)
            ->paginate(20);

var_dump($products);

但我找不到解决方案。 请帮忙。提前致谢。

【问题讨论】:

  • 尝试使用-&gt;having('distance', '&lt;', 50)
  • 你知道现代版本的 MySQL 有这个用例的 POINT 数据类型,不是吗?如果您使用它而不是将纬度和经度存储为数字,这将容易得多。
  • 不,我不知道。我需要调查一下。如果你能给我一个帮助的例子,那将是很大的帮助。
  • @Ashish 好吧,我之前只用 PostgreSQL 做过,所以我不能给出具体的例子,但我在github.com/grimzy/laravel-mysql-spatial 找到了一个 Laravel 包,旨在复制包的功能我用过,所以我建议你看看。
  • 好的,非常感谢

标签: php mysql sql laravel


【解决方案1】:

我得到了解决方案,这是查询

$lat = Auth::user()->latitude;
        $long = Auth::user()->longitude;
        $products = Products::selectRaw('id, title, (
    3959 * acos (
      cos ( radians(30.7062683) )
      * cos( radians( latitude ) )
      * cos( radians( longitude ) - radians(76.7165878) )
      + sin ( radians(30.7062683) )
      * sin( radians( latitude ) )
    )
  ) AS distance')->orderBy('distance')->having('distance', '<', 100)->paginate(50);
        var_dump($products);

然后安装并遵循这个包。我会帮你的 https://github.com/justbetter/laravel-pagination-with-havings 我希望它将来对某人有所帮助。快乐编码!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多