Laravel基于MongoDb(LBS)实现附近的人、店铺、房源

简介: 前提PHP需要安装MongoDb扩展 一、Laravel安装mongodb扩展 composer require jenssegers/mongodb ^3.6 -vvv 前提PHP需要安装MongoDb扩展一、Laravel安装mongodb扩展composer require jen...
简介: 前提PHP需要安装MongoDb扩展 一、Laravel安装mongodb扩展 composer require jenssegers/mongodb ^3.6 -vvv

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


三、如果要做附近的人要设置索引

attachments-2022-10-vrFFBP3b6350f0915b19d,png


四、封装附近的推荐服务类

<?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);
  • 发表于 2022-10-20 14:50
  • 阅读 ( 33 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章