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

本文介绍了如何在Laravel中安装并使用MongoDB扩展,通过示例展示了如何在控制器中插入测试数据,并详细讲解了如何创建附近卖家推荐服务类,包括设置索引和封装搜索方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值