如何在 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
对象作为第三个参数传递,并带有 longitude
和 latitude
属性。
您可以调整弧度(经度)
以匹配您的模型表。或者您可以使用 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/