在很多场景我们都会使用位置范围服务:
如:查找附近的单车、旅店、饭店等等。tp5框架的使用还是比挺多的,关于tp5中的查询条件已经默认拥有了near查询处理了,但结果并不能满足我们的一些需求。参考到一篇文章,所以对 tp5中的范围查找进行记录,希望可以帮助到有同等需求的小伙伴们。
需要了解mongoDB的2dsphere、2d索引服务,及空间查找的基本使用语法。
composer.json 文件添加
"require": {
"topthink/think-mongo": "2.0.*"
},
或者 到 vendor文件夹下打开终端用命令添加扩展:composer require topthink/think-mongo
public function mongo(){
$lat = '22.54164073';
$lng = '114.0474614';
$lat = floatval($lat);
$lng = floatval($lng);
$res = Db::connect(Config('mongodb')) -> table('guest') -> where(['location'=>['near',[$lng,$lat,5000]]]) -> limit(10) -> select();
dump($res);
}
上面的 where 条件没有默认的,所以要修改一下
找到要修改的文件:项目\vendor\topthink\think-mongo\src\Builder.php 并找到 parseWhereItem 方法
......
}elseif ('near' == $exp) {
// 经纬度查询
//$query[$key] = ['$near' => $this->parseValue($value, $key)];
//空间点距查询
$query[$key] = (object)['$near' => (object)['$geometry' => (object)['type' => "Point" ,'coordinates' => [$value[0],$value[1]]],'$maxDistance' => $value[2]]];
}
......
找到上面 near == $exp 这项,经纬度查询的代码注释掉,并添加空间点查询这项代码
OK ,最后测试成功