前提PHP需要安装MongoDb扩展
一、Laravel安装mongodb扩展
composer require jenssegers/mongodb ^3.6 -vvv
二、控制器方法填充一些测试数据
$res = DB::connection('mongodb')
->table('t2')
->insert( [
'name'=>'juejin',
'loc' => [
'longitude' => 116.48105 ,
'latitude' =>39.996794,
],
]);
$res = DB::connection('mongodb')
->table('t2')
->insert( [
'name'=>'ireader',
'loc' => [
'longitude' => 116.514203 ,
'latitude' =>39.905409,
],
]);
$res = DB::connection('mongodb')
->table('t2')
->insert( [
'name'=>'meituan',
'loc' => [
'longitude' => 116.489033,
'latitude' =>40.007669,
],
]);
$res = DB::connection('mongodb')
->table('t2')
->insert( [
'name'=>'jd',
'loc' => [
'longitude' => 116.562108 ,
'latitude' =>39.787602,
],
]);
$res = DB::connection('mongodb')
->table('t2')
->insert( [
'name'=>'xiaomi',
'loc' => [
'longitude' => 116.334255 ,
'latitude' =>40.027400,
],
]);
三、如果要做附近的人要设置索引
四、封装附近的推荐服务类
<?php
namespace App\Http\Controllers\Service;
use Illuminate\Support\Facades\DB;
class NearbySeller
{
private $longitude;#经度
private $latitude;#纬度
private $mongodb;
/**
* 初始化
*
* @param string $collection 需要操作的集合
* @param float $longitude 经度
* @param float $latitude 纬度
*/
public function __construct($collection, $longitude, $latitude)
{
$this->longitude = (float)$longitude;
$this->latitude = (float)$latitude;
$this->mongodb = DB::connection('mongodb')->collection($collection);
}
/**
* 搜索多少km内的信息,由近到远的顺序返回
* @param integer $kilometer 获取多少km内的信息
* @param integer $perPage 获取多少数据,每页
* @param integer $page 获取的第几页,
*
* @return 返回获取到的地址距离
*/
public function getRangeBySort($kilometer, $page, $limit)
{
$where = [
'loc' => [
'$nearSphere' => [
'$geometry' => [
'type' => 'Point',
'coordinates' => [$this->longitude, $this->latitude]
],
'$maxDistance' => $kilometer*1000
]
],
];
$list = $this->mongodb->whereRaw($where)->skip(($page-1) * $limit)->take($limit)->get();
return $list;
}
/**
* 搜索多少km内的信息,由近到远的顺序返回
* @param integer $kilometer 获取多少km内的信息
*
* @return 返回获取到的地址距离
*/
public function getRadiusBydisorder($kilometer)
{
$where = [
'loc' => [
'$geoWithin' => [
'$centerSphere' => [
[
$this->longitude,
$this->latitude
],
$kilometer/6371
]
]
],
];
$list = $this->mongodb->whereRaw($where)->get();
return $list;
}
}
五、控制器方法进行调用
$near = new NearbySeller('t2', 116.48105, 39.996794);
$page = $request->get('page') ?: 1;
$limit = 3;
// 测试获取多少km以内的门店信息,列表模式
$list = $near->getRangeBySort(20, $page, $limit);
// 测试多少km半径内的门店信息,地图模式
$list = $near->getRadiusBydisorder(20);