前提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);