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

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

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

Laravel基于MongoDB(LBS)实现附近的人、店铺、房源_第1张图片

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

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

你可能感兴趣的:(php,mongodb,laravel,php)